【发布时间】:2020-11-05 13:05:27
【问题描述】:
我有一个如下所示的序列化对象:
{
"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 设置为其初始值的对象。 我做错了什么?
编辑:在 postsharp 文档中说:
请注意,当向字段添加 LocationInterceptionAspect 时,该字段将替换为具有相同字段和可见性的属性。该字段本身已重命名并设为私有。
编辑 2:为了清楚起见,我删除了静态变量并更改了反序列化以反映我的真实意图。
【问题讨论】:
-
var3不是属性而是变量,变量没有后备字段。像这样声明public string var3 { get; set; } -
@RandRandom 我不想更改 var3,这是一个更大项目的一部分,我不想将每个字段都更改为属性。是的 var3 在编译时成为属性,因为 Postsharp 请参阅有关 locationInterceptionAspect => doc.postsharp.net/location-interception 的链接
-
来自链接的引用:请注意,当向字段添加 LocationInterceptionAspect 时,该字段将替换为相同字段和可见性的属性。该字段本身已重命名并设为私有。
-
C# 区分大小写,您的 json 具有
Var3,但您的类已将其定义为var3,在这两种情况下都可以选择V或v。 -
@RandRandom 就像我在帖子中所说的那样,我尝试了两种语法。看看我发布的 4 个 JSON。
标签: c# json serialization json.net postsharp