首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么在json反序列化过程中没有设置字段?

为什么在json反序列化过程中没有设置字段?
EN

Stack Overflow用户
提问于 2020-11-05 13:05:27
回答 2查看 540关注 0票数 0

我有一个序列化对象,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
{
  "Var4": "value set in Foo()",
  "var3": "value set in NestedFoo()",
  "<var3>k__OriginalField": "value set in NestedFoo()",
  "<Var4>k__BackingField": "value set in Foo()"
}

它来自于这个对象:

代码语言:javascript
代码运行次数:0
运行
复制
public class DummyClass 
    {
        [ModificationTrackerAspect]
        public string var3 = "initialValue";
        public string Var4 { get; set; } = "initialValue";
        
    }

在var3上有一个继承自Postsharp方面LocationInterceptionAspect的属性。这个方面的副作用是将受影响的字段更改为属性,并为该属性创建一个支持字段(字段为"<var3>k__OriginalField" )。

在序列化期间,一切似乎都正常,但由于我想反序列化它,所以无法设置var3字段/属性。

反序列化是这样发生的:

代码语言:javascript
代码运行次数:0
运行
复制
instanceTypeName = ... (fetched from a text file);
unknowclassDeserialized = JsonConvert.DeserializeObject(json, Type.GetType(instanceTypeName));

我尝试将调试器中的json更改为:

代码语言:javascript
代码运行次数:0
运行
复制
{
  "Var4": "value set in Foo()",
  "var3": "value set in NestedFoo()",
  "<Var4>k__BackingField": "value set in Foo()"
}

代码语言:javascript
代码运行次数:0
运行
复制
{
  "Var4": "value set in Foo()",
  "Var3": "value set in NestedFoo()",
  "<var3>k__OriginalField": "value set in NestedFoo()",
  "<Var4>k__BackingField": "value set in Foo()"
}

最后:

代码语言:javascript
代码运行次数:0
运行
复制
{
  "Var4": "value set in Foo()",
  "Var3": "value set in NestedFoo()",
  "<Var4>k__BackingField": "value set in Foo()"
}

但是,我总是得到一个对象,它的var4设置正确,var3设置为它的初始值。我做错什么了?

编辑:在后面的文档中有这样的说法:

注意,当将LocationInterceptionAspect添加到字段时,该字段将被相同字段和可见性的属性替换。该字段本身被重命名为私有字段。

编辑2:为了清晰起见,我删除了静态变量,并更改了反序列化以反映我的真实意图。

EN

回答 2

Stack Overflow用户

发布于 2020-11-05 13:30:02

在我的选择中,您有一个问题,即您的财产名称中有非法字符。我建议使用JsonProperty注释和子构造函数。重要的是,松散静态,因为这个内存地址将被用于这个类的每一个实例,使它成为类似于“单例”的值,怀疑这就是你的意图。

代码语言:javascript
代码运行次数:0
运行
复制
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; } 
        
}
票数 0
EN

Stack Overflow用户

发布于 2020-11-08 23:44:28

罪魁祸首是它添加的属性上由[CompilerGenerated]发出的PostSharp属性。

默认情况下,默认契约解析器会忽略具有这些属性的所有字段/属性。您需要通过在SerializeCompilerGeneratedMembers上设置DefaultContractResolver来覆盖此行为,即:

代码语言:javascript
代码运行次数:0
运行
复制
JsonConvert.SerializeObject(
    before, 
    new JsonSerializerSettings() 
    { 
        ContractResolver = new DefaultContractResolver() 
        { 
            SerializeCompilerGeneratedMembers = true 
        } 
    })

如果数据已经序列化,您可能需要编写自己的自定义解析器来提供正确的映射。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64697831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档