Ana*_*tts 14 wcf serialization
每当我使用WCF时,我总是尝试创建最终通过线路的不可变类(即在构造函数中设置的参数,属性是只读的).但是,这会妨碍WCF序列化,这要求所有属性都是Public get/set(这是有意义的,因为它必须反序列化它们)
即使在这篇相关文章中,我也看到他们的解决方案最终将所有内容都公开,这违反了我的良好编程感.有没有办法解决?我是否必须满足于这种解决方案或类似冰棒不变性的东西,并对它感到满意?
我试过的另一件事是这样的,我有一个基类用于所有东西,一个派生类使得这个集无用:
/// <summary>
/// This represents a discovered virtual-machine template that can be
/// instantiated into a RunningVirtualMachine
/// </summary>
[DataContract]
[XmlRoot("VMTemplate")]
public class VirtualMachineTemplateBase
{
[DataMember]
public virtual ulong SizeInBytes { get; set; }
}
/// <summary>
/// This class is the real guts of VirtualMachineTemplate that we're hiding
/// from the base class.
/// </summary>
[XmlInclude(typeof(VirtualMachineTemplateBase))]
public class VirtualMachineTemplate : VirtualMachineTemplateBase, IXmlPicklable, IEnableLogger
{
ulong _SizeInBytes;
public override ulong SizeInBytes {
get { return _SizeInBytes; }
set { }
}
}
Run Code Online (Sandbox Code Playgroud)
mar*_*c_s 15
如果您使用DataContractSerializer(这是WCF的默认设置),您可以序列化使用该[DataMember]属性修饰的任何内容- 甚至是只读字段:
[DataContract]
public class VirtualMachineTemplate : VirtualMachineTemplateBase, IXmlPicklable, IEnableLogger
{
[DataMember]
ulong _SizeInBytes;
}
Run Code Online (Sandbox Code Playgroud)
但是您需要使用DataContractSerializer - 而不是XML序列化程序.XML序列化程序只能序列化公共属性(除非你在它们上放一个[XmlIgnore]).
DataContractSerializer是不同的:
[DataMember]渣