【问题标题】:Serialize null reference object序列化空引用对象
【发布时间】:2015-08-30 06:50:46
【问题描述】:

我正在尝试通过迭代其属性来“序列化”某个类型,并将每个值类型写入字典。

serialize(object)
    foreach(prop in object.GetType().GetProperties()

        value = prop.GetValue(object);
        if (prop.PropertyType.isValueType)
            writeToDict(prop.Name, value)
        else
            serialize(value)

给定某种类型

public class ComplexType {
    public string Prop1 { get; set; }
    public int Prop2 { get; set; }
    public OtherType Prop3 { get; set; }
}

public class OtherType {
    public string Prop4 { get; set; }
}

现在,当我创建ComplexType 的实例并尝试“序列化”它时,它可以正常工作,直到它迭代Prop3 (OtherType)。当我尝试调用 value.GetType() 时,我遇到了 NullReferenceException,因为当然,从来没有设置为 Prop3 的引用。

有没有办法解决这个问题?其他序列化框架如何做到这一点? (我的意思是,我什至无法创建该类型的默认实例,因为我不知道运行时的类型!)

哦,是的,我不能跳过该属性,因为我对结构感兴趣(即使它没有设置值)。

【问题讨论】:

  • 你想对空引用类型做什么?
  • @YuvalItzchakov 只是'序列化'(用字符串变平)它是字典中的类型结构,如果我能够得到它,值将与它一起存储(尽管这并不重要。 ) 所以我最终会得到一个包含以下内容的字典:Prop1=30, Prop2=, Prop3.Prop4=(对于上面的示例)
  • 但是它没有被初始化。该类型没有设置任何值。

标签: c# .net serialization reflection types


【解决方案1】:

好的,我想通了。 NullReferenceException 发生是因为我很愚蠢。

对于将来尝试获取未初始化引用类型的任何人:

如果您在对象上调用.GetType(),.NET 框架会在内存中查找该对象的引用。因为对象还没有被初始化,所以没有什么可以查找的,因此会抛出一个NullReferenceException。如果你想遍历一个实例的属性,你至少需要最上面的父类的类型,然后你可以通过PropertyInfo.PropertyType获取进一步引用类型属性的类型(而不是直接从你拉出的对象中获取)父属性)。

【讨论】:

    【解决方案2】:

    好吧,我遇到了这个问题,这个问题已经被初学者解决了。只是想知道使用 json 序列化程序的标准方法在这里是否可以。非常简单,就像

    var newObjectOfComplexType = new ComplexType()
            {
                Prop1 = "Prop1Value",
                Prop2 = 3,
                Prop3 = new OtherType() {Prop4 = "Prop4Value"}
            };
    
    var serializedResult = JsonConvert.SerializeObject(newObjectOfComplexType);
    

    将给出与您正在寻找的结果非常相似的结果:

    {"Prop1":"Prop1Value","Prop2":3,"Prop3":{"Prop4":"Prop4Value"}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多