DataContractSerialiser和Serializable的问题

时间:2011-03-11 09:02:01

标签: c# serialization reference datacontractserializer xmlserializer

我有一些来自asembly的类是.Net 2.0。这些类与Serializable一起使用。

在我的项目中,我在我的类中使用这些类,它们标有DataContract(IsReference = true)和DataMember。

现在我有了问题,DataContractSerialiser将序列化我的.Net 2.0类的私有字段,这将无法正常工作。但是当我使用XMLSerialiser时,我不能使用IsReference,因此我也不能这样做。

这有一个简单的(简单)Solutiuon吗?也许某人有自己的XMLSerializer,它支持引用?

她是我的代码......

[DataContract(IsReference = true)]
public class ConnectionConfig: INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
            PropertyChanged(this, new PropertyChangedEventArgs("ObjectAsString"));
        }
    }

    private PLCConnectionConfiguration _configuration;
    [DataMember]
    public PLCConnectionConfiguration Configuration
    {
        get { return _configuration; }
        set { _configuration = value; NotifyPropertyChanged("Configuration"); }
    }
}

其中PLCConnectionConfiguration来自.NET 2.0程序集,并使用[Serializableable]

进行修饰

3 个答案:

答案 0 :(得分:0)

使用[DataContract]注释类型应该足以告诉它查找标记为[DataMember]的成员 - 但听起来好像你有数据合同和vanilla对象的组合。

如果您严格需要xml,我的建议是编写一组DTO类型并在图形模式下使用DCS。这可能需要在对象模型和DTO之间进行一些映射;但这通常不是一个大问题。另请注意,图形模式下的DCS 典型的xml输出 - 它与XmlSerializer输出的内容非常不同。

如果你只需要序列化任意类型(xml不是问题),那么protobuf-net的当前 实验 剪切支持所有这些场景;它将处理对象引用,它将允许您使用带注释和类型的(您只需要告诉它如何)。如果这是一个选项,也许提供一个模型的基本示例,我可能会填补一些空白。

答案 1 :(得分:0)

您应该从域模型中抽象出WCF数据对象。将datacontracts视为您要在服务中返回的模型的视图。

使用[DataContract]属性以及要使用[DataMember]属性公开的所有属性为您的datacontract添加注释。如果存在您不想返回的属性,请不要使用[DataMember]属性对其进行注释。

如果您希望您的域模型是XmlSerializable,则使用[Serializable]属性注释该类。

它可能需要一些额外的打字和转换,但它更清晰整体imho。

答案 2 :(得分:0)

也许您可以使用XmlSerializer并指定XmlAttributeOverrides来忽略您不感兴趣的私有字段:

var overrides = new XmlAttributeOverrides();
overrides.Add(typeof(PLCConnectionConfiguration), <name of private field to exclude>, new XmlAttributes { XmlIgnore = true });
...
var serialiser = new XmlSerializer(typeof(ConnectionConfig), overrides);

您显然还必须将ConnectionConfig标记为Serializable,并将[XmlIgnore]添加到_configuration字段。