我正在自動化如何[Serializable]
在 Unity 中序列化具有 Json 屬性的類。
我試圖FieldInfo
通過反射獲取并傳遞該值以將其決議為Json,但它失敗了。輸出空大括號。
問題代碼
public static class SerializeHelper
{
public static void SerializeObjectField()
{
var fieldsInfo = GameInfo.Instance.GetType().GetFields(
BindingFlags.Public | BindingFlags.Instance);
foreach (var fieldInfo in fieldsInfo)
{
ToJson(fieldInfo);
}
}
private static void ToJson(FieldInfo fieldInfo)
{
var json = JsonUtility.ToJson(fieldInfo, true);
Debug.Log(json); // Empty curly braces are output
}
}
public class GameInfo : MonoBehaviour
{
// Sigleton Pattern
public Gold gold = new();
public int Gold
{
get => gold.Amount;
set => gold.Amount = value;
}
// ...
}
[Serializable]
public class Gold
{
[SerializeField] private int amount;
public int Amount
{
get => amount;
set => amount = value;
}
}
如果我在不使用反射的情況下手動撰寫它,它的輸出就很好。
正確的代碼
// ...
var json = JsonUtility.ToJson(GameInfo.Instance.gold, true);
Debug.Log(json);
// ...
輸出
{
"amount": 43 // Create a button that increments by 1 for every click
}
你能告訴我使用反射時我做錯了什么嗎?
uj5u.com熱心網友回復:
您錯過了一個電話,屬性資訊為您提供了與類定義相關但與您的實際實體無關的欄位/屬性的描述。
要實際獲取值,您需要在屬性資訊上呼叫 GetValue 方法
嘗試更換
var json = JsonUtility.ToJson(fieldInfo, true);
類似于:
var json = JsonUtility.ToJson(fieldInfo.GetValue(instanceReference), true);
下面是一個作業示例:
public class ReflectionTest : MonoBehaviour
{
[System.Serializable]
public class TestClass
{
public string myString = "test";
}
public TestClass testClassInstance = new TestClass();
void OnValidate()
{
var fieldInfo = this.GetType().GetField("testClassInstance");
var value = fieldInfo.GetValue(this);
var valueString = JsonUtility.ToJson(value);
Debug.Log($"after serialization {valueString}");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/475313.html
下一篇:靜態函式隨每個實體更新