在没有所有属性的情况下设置DataContract和DataMember

时间:2011-08-31 23:46:41

标签: c# entity-framework

我发现[DataContract][DataMember]属性有点乱,宁愿用config方法中的代码做一些事情。这可能吗?

3 个答案:

答案 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;  
}