我试图通过遍历其属性来“序列化”某个类型,并将每个值类型写入字典。
伪
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
的参考设置。
有什么方法可以解决这个问题吗?其他序列化框架如何做到这一点? (我的意思是,我甚至无法创建该类型的默认实例,因为我在运行时不知道该类型!)
哦,是的,我不能跳过这个属性,因为我对结构很感兴趣(即使它没有设置值)。
答案 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"}}