C# DataContractSerialiser和Serializable的问题

C# DataContractSerialiser和Serializable的问题,c#,serialization,reference,datacontractserializer,xmlserializer,C#,Serialization,Reference,Datacontractserializer,Xmlserializer,我从.NET2.0程序集中得到了一些类。这些类用Serializable标记 在我的项目中,我在类中使用这些类,这些类用DataContract(IsReference=true)和DataMember标记 现在我遇到了一个问题,DataContractSerialiser序列化了我的.NET2.0类的私有字段,这将不起作用。但是当我使用XMLSerialiser时,我不能使用IsReference,所以我也不能这样做 有没有一个简单的解决方案?也许某人有自己的支持引用的XMLSerialize

我从.NET2.0程序集中得到了一些类。这些类用Serializable标记

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

现在我遇到了一个问题,DataContractSerialiser序列化了我的.NET2.0类的私有字段,这将不起作用。但是当我使用XMLSerialiser时,我不能使用IsReference,所以我也不能这样做

有没有一个简单的解决方案?也许某人有自己的支持引用的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程序集,并用[Serializable]

装饰,用
[DataContract]
注释类型应该足以告诉它查找标记为
[DataMember]
的成员,但听起来可能是数据契约和普通对象的组合

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


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

[DataContract]
注释一个类型应该足以告诉它查找标记为
[DataMember]
的成员-但听起来可能您有数据契约和普通对象的组合

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


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

您应该从您的域模型中提取WCF数据契约。考虑DATACONTRATS是您想在您的服务中返回的模型的视图。

使用
[datacontract]
属性注释datacontract,并使用
[DataMember]
属性注释所有要公开的属性。如果有不想返回的属性,只需不使用
[DataMember]
属性对其进行注释即可

如果希望域模型是XmlSerializable的,可以使用
[Serializable]
属性对类进行注释


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

您应该从您的域模型中提取WCF数据契约。考虑DATACONTRATS是您想在您的服务中返回的模型的视图。

使用
[datacontract]
属性注释datacontract,并使用
[DataMember]
属性注释所有要公开的属性。如果有不想返回的属性,只需不使用
[DataMember]
属性对其进行注释即可

如果希望域模型是XmlSerializable的,可以使用
[Serializable]
属性对类进行注释


它可能需要一些额外的键入和转换,但总体上更清晰。

也许您可以使用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);
var overrides=new XmlAttributeOverrides();
Add(typeof(PLCConnectionConfiguration),新的xmldattributes{XmlIgnore=true});
...
var serialiser=新的XmlSerializer(typeof(ConnectionConfig),重写);

显然,您还必须将ConnectionConfig标记为可序列化,并将[XmlIgnore]添加到_配置字段。

也许您可以使用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);
var overrides=new XmlAttributeOverrides();
Add(typeof(PLCConnectionConfiguration),新的xmldattributes{XmlIgnore=true});
...
var serialiser=新的XmlSerializer(typeof(ConnectionConfig),重写);

显然,您还必须将ConnectionConfig标记为可序列化,并将[XmlIgnore]添加到_配置字段。

您的意思是不希望它序列化私有字段(通常DataContractSerializer仅序列化公共属性)?或者,当他尝试序列化时,您遇到了一个错误,但失败了?是的,我不想序列化私有字段,但DataContractSerializer在用[Serializable]修饰的类上执行此操作,在本例中,
PLCConnectionConfiguration
?它是来自另一个asembly的类,我无法更改。此类是可序列化的,但不能使用DataContractSerializer,因为它序列化私有字段!(这是我的问题!)您的意思是不希望它序列化私有字段(通常DataContractSerializer只序列化公共属性)?或者,当他尝试并失败时,您会得到一个错误?是的,我不想序列化私有字段