我发现[DataContract]
和[DataMember]
属性有点乱,宁愿用config方法中的代码做一些事情。这可能吗?
答案 0 :(得分:16)
您根本不必使用这些属性。 DataContractSerializer
将使用getter和setter序列化所有公共属性,但是如果序列化具有导航属性的实体,由于“循环引用”,您将很容易以异常结束。
要避免该异常,您必须在实体类上使用[DataContract(IsReference = true)]
,在每个要进行serilize的属性上使用DataMember
,或者在您不想序列化的每个属性上使用IgnoreDataMember
。
最后一个也是最复杂的选项是完全避免属性和实现IDataContractSurrogate
的自定义类来控制类型之外的序列化。
您还可以编写完全自定义的序列化过程,或使用XML序列化或二进制序列化及其所有要求。
答案 1 :(得分:1)
不,DataContractSerializer是一个选择加入的序列化程序 - 您必须告诉它您想要包含的内容。
使用其他序列化程序,您需要使用NonSerializedAttribute或XmlIgnoreAttribute之类的东西来告诉序列化程序不要管它。
答案 2 :(得分:0)
我知道这是一篇比较老的文章,但是如果有一种方法可以在具有公共字段且没有getter和setter的某些旧代码上自动设置所有成员属性,我来这里也是在想同样的事情。
使它看起来少一点混乱的原因是缩短了DataMember的名称:
using DM = System.Runtime.Serialization.DataMemberAttribute;
[DataContract]
public class SomeClass
{
[DM] public bool IsMO;
[DM] public string LabCode;
[DM] public string OrderNumber;
}