不使用所有属性设置DataContract和DataMember

20

我认为[DataContract][DataMember]属性有点混乱,我更愿意使用配置方法或其他方式来实现。这样做是否可行?


4
前期装饰有什么混乱之处? - Mitch Wheat
2
不确定如何回答。有点混乱。 - Jeremy Foster
3
我有很多实体,大部分我都希望扩展它们,包括所有属性,所以重复写数百次一个属性感觉很繁琐。我希望能找出"选择性排除"的方法,正如Ladislov在下面帮助我的那样。我更愿意修饰那些我不想包含的成员。 - Jeremy Foster
3个回答

20

您不必使用这些属性。 DataContractSerializer 将序列化所有具有 getter 和 setter 的公共属性,但是如果要序列化具有导航属性的实体,则很容易出现“循环引用”异常。

为了避免该异常,您必须在实体类上使用 [DataContract(IsReference = true)],并在要序列化的每个属性上使用 DataMember,或者在不想序列化的每个属性上使用 IgnoreDataMember

最后一种也是最复杂的选择是完全避免使用属性,而是使用自定义类实现 IDataContractSurrogate 来控制类型外的序列化。

您还可以编写完全自定义的序列化过程,或使用 XML 序列化或二进制序列化及其所需的所有要求。


4
我在类中添加[DataContract],并可以从WCF操作返回该类...但内容为空,所以我向一些属性添加[DataMember],突然这些属性就被返回在序列化的结果中了(只有这些属性被返回)。那么为什么我的代码没有像你说的那样默认返回所有属性呢? - Jeremy Foster
顺便提一下,它们是具有 {get; set;} 的公共属性。 - Jeremy Foster
8
一旦您添加了DataContract属性,就必须使用DataMember属性标记要进行序列化的属性。我所描述的默认序列化仅在根本不使用DataContract属性时才有效。 - Ladislav Mrnka
1
可以了!耶哈!现在我需要通过WCF弄清楚懒加载的问题,但如果我无法解决它,我会处理它并启动一个新线程。谢谢。 - Jeremy Foster

3
不,DataContractSerializer是一种选择性的序列化器 - 你需要告诉它你想要包含什么。
使用其他序列化器时,你需要使用NonSerializedAttribute或XmlIgnoreAttribute等东西来告诉序列化器保持不变。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接