序列化null引用对象

时间:2015-06-14 20:01:30

标签: c# .net serialization reflection types

我试图通过遍历其属性来“序列化”某个类型,并将每个值类型写入字典。

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的实例并尝试'序列化'它时,它会正常工作,直到它迭代Prop3OtherType)。当我尝试在其上调用value.GetType()时,我会遇到NullReferenceException,因为当然,从未有过Prop3的参考设置。

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

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

2 个答案:

答案 0 :(得分:1)

好的,我明白了。发生NullReferenceException是因为我很蠢。

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

如果在对象上调用.GetType(),.NET框架会在内存中查找该对象的引用。由于该对象尚未初始化,因此无需查找,因此会抛出NullReferenceException。如果要遍历实例的属性,至少需要最上层父类的类型,那么您可以通过PropertyInfo.PropertyType获取其他引用类型属性的类型(而不是直接获取的对象)超出父母属性。)

答案 1 :(得分:0)

好吧,我在启动器已经解决了这个问题后遇到了这个问题。只是想知道使用json序列化器的标准方法是否正常。 Smth非常简单,如

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"}}