【发布时间】:2021-05-26 05:43:12
【问题描述】:
我遇到了一个奇怪的问题,当我使用 JsonConvert.SerializeObject(Unity 的 Json.Net 的一部分)序列化我的一个类时,基于输出的反序列化似乎跳过了一些属性。比如这段代码:
JSonModifier healthMod = new JSonModifier("PlayerMain", "Health", "BaseAdd", 1f);
JSonModifierSkill jMod = new JSonModifierSkill(healthMod, "Staunch Warrior", 5, new string[0], new string[0]);
Debug.Log(JsonConvert.SerializeObject(jMod));
File.WriteAllText(jsonLocation, JsonConvert.SerializeObject(jMod));
Debug.Log(File.ReadAllText(jsonLocation));
JSonModifierSkill swJmod = JsonConvert.DeserializeObject<JSonModifierSkill>(File.ReadAllText(jsonLocation));
swJmod.Print();
ModifierSkill StaunchWarrior = swJmod.GetModifierSkill();
Debug.Log(StaunchWarrior.skillName + " " + StaunchWarrior.MaxLevel + " " + StaunchWarrior.skillModifier.valueType + " " + StaunchWarrior.locked + " " );
产生以下输出:
{"skillName":"Staunch Warrior","MaxLevel":5,"statRequirements":[],"skillPrerequisites":[],"modifier":{"type":"PlayerMain","valueType":"Health" ,"ModEffect":"BaseAdd","value":1.0}}
{"skillName":"Staunch Warrior","MaxLevel":5,"statRequirements":[],"skillPrerequisites":[],"modifier":{"type":"PlayerMain","valueType": "健康","ModEffect":"BaseAdd","value":1.0}}
PlayerMain Health BaseAdd 1
5 System.String[]
5 baseAdd False
以下是相关类:
class JSonModifier
{
public string type;
public string valueType;
public string ModEffect;
public float value;
public JSonModifier(string _type, string _valueType, string _modEffect, float _value){
type = _type;
valueType = _valueType;
ModEffect = _modEffect;
value = _value;
}
public void Print(){
Debug.Log(type + " " + valueType + " " + ModEffect + " " + value);
}
public Modifier GetModifier(){
ModifierType modType;
ModifierValueType modValType;
PlayerMainModEffect modEffect;
Enum.TryParse(type, out modType);
Enum.TryParse(valueType, out modValType);
Enum.TryParse(ModEffect, out modEffect);
return new Modifier(modType, modEffect, modValType, value);
}
}
class JSonModifierSkill
{
[JsonProperty(Order = 1)]
public string skillName{get;}
[JsonProperty(Order = 2)]
public int MaxLevel{get;protected set;}
[JsonProperty(Order = 3)]
public String[] statRequirements;
[JsonProperty(Order = 4)]
public String[] skillPrerequisites {get;}
[JsonProperty(Order = 5)]
public JSonModifier modifier;
public JSonModifierSkill(JSonModifier _modifier, string _skillName, int __maxLevel, String[] statReq, String[] skillReq){
modifier = _modifier;
skillName = _skillName;
MaxLevel = __maxLevel;
statRequirements = statReq;
skillPrerequisites = skillReq;
}
public void Print(){
modifier.Print();
Debug.Log(skillName + " " + MaxLevel + " " + statRequirements + " " + skillPrerequisites);
}
public ModifierSkill GetModifierSkill(){
Modifier mod = new Modifier(ModifierType.PlayerMain, PlayerMainModEffect.Health, ModifierValueType.baseAdd, 1f);
//modifier.Print();
//mod = modifier.GetModifier();
return new ModifierSkill(skillName, MaxLevel, mod);
}
我真的很难过,因为 JSonModifier、statRequirements 和 MaxLevel 属性似乎可以很好地反序列化,而且我没有收到任何错误,但是 SkillName 和 SkillPrerequisistes 消失了?
希望有人能告诉我哪里出错了。谢谢!
【问题讨论】:
-
原来你需要一个 setter 来设置属性的值,谁知道呢? ;)
-
对于您正在使用的数据,您可以简单地使用内置的
JsonUtility.. 我会确保创建类[Serializable]并使用字段而不是属性。如果您想要只读访问权限,请执行[SerializeField] private string someField; public string SomeField => someField;;) -
@derHugo 我建议使用市场上的免费 Json.Net 扩展,内置的 Unity Json 非常乏味(基本上只能处理原语 iirc)。至少,这给了我很多问题。并感谢您的提示!
-
我提到它是因为你是只在你的类中使用基本类型;)
标签: c# json unity3d serialization