我有一个序列化对象,如下所示:
{
"Var4": "value set in Foo()",
"var3": "value set in NestedFoo()",
"<var3>k__OriginalField": "value set in NestedFoo()",
"<Var4>k__BackingField": "value set in Foo()"
}
它来自于这个对象:
public class DummyClass
{
[ModificationTrackerAspect]
public string var3 = "initialValue";
public string Var4 { get; set; } = "initialValue";
}
在var3上有一个继承自Postsharp方面LocationInterceptionAspect的属性。这个方面的副作用是将受影响的字段更改为属性,并为该属性创建一个支持字段(字段为"<var3>k__OriginalField"
)。
在序列化期间,一切似乎都正常,但由于我想反序列化它,所以无法设置var3字段/属性。
反序列化是这样发生的:
instanceTypeName = ... (fetched from a text file);
unknowclassDeserialized = JsonConvert.DeserializeObject(json, Type.GetType(instanceTypeName));
我尝试将调试器中的json更改为:
{
"Var4": "value set in Foo()",
"var3": "value set in NestedFoo()",
"<Var4>k__BackingField": "value set in Foo()"
}
或
{
"Var4": "value set in Foo()",
"Var3": "value set in NestedFoo()",
"<var3>k__OriginalField": "value set in NestedFoo()",
"<Var4>k__BackingField": "value set in Foo()"
}
最后:
{
"Var4": "value set in Foo()",
"Var3": "value set in NestedFoo()",
"<Var4>k__BackingField": "value set in Foo()"
}
但是,我总是得到一个对象,它的var4设置正确,var3设置为它的初始值。我做错什么了?
编辑:在后面的文档中有这样的说法:
注意,当将LocationInterceptionAspect添加到字段时,该字段将被相同字段和可见性的属性替换。该字段本身被重命名为私有字段。
编辑2:为了清晰起见,我删除了静态变量,并更改了反序列化以反映我的真实意图。
发布于 2020-11-05 13:30:02
在我的选择中,您有一个问题,即您的财产名称中有非法字符。我建议使用JsonProperty注释和子构造函数。重要的是,松散静态,因为这个内存地址将被用于这个类的每一个实例,使它成为类似于“单例”的值,怀疑这就是你的意图。
public class DummyClass
{
[JsonProperty("Var3")]
private string var1 = "initialValue";
[JsonProperty("Var4")]
private string Var2 = "initialValue";
[ModificationTrackerAspect]
[JsonIgnore]
public string Var3 =>var1 ;
[JsonIgnore]
public string Var4 { get=>Var2 ; set=> Var2=value; }
}
发布于 2020-11-08 23:44:28
罪魁祸首是它添加的属性上由[CompilerGenerated]
发出的PostSharp属性。
默认情况下,默认契约解析器会忽略具有这些属性的所有字段/属性。您需要通过在SerializeCompilerGeneratedMembers
上设置DefaultContractResolver
来覆盖此行为,即:
JsonConvert.SerializeObject(
before,
new JsonSerializerSettings()
{
ContractResolver = new DefaultContractResolver()
{
SerializeCompilerGeneratedMembers = true
}
})
如果数据已经序列化,您可能需要编写自己的自定义解析器来提供正确的映射。
https://stackoverflow.com/questions/64697831
复制相似问题