只读属性的WCF DataContract序列化?

标签 wcf serialization

每当我使用 WCF 时,我总是尝试创建最终通过网络传输的不可变类(即在构造函数中设置的参数,属性是只读的)。但是,这妨碍了 WCF 序列化,它要求所有属性都是 Public get/set(这是有道理的,因为它必须反序列化它们)

即使在 this related post ,我看到他们的解决方案最终将所有内容都公开,这违反了我对良好编程的感觉。有没有办法解决?我是否必须满足于这个解决方案或类似冰棒不变性的东西并对此感到满意?

我尝试的另一件事是这样的,我有一个所有东西的基类和一个使集合无用的派生类:

/// <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 { }
    }
}

最佳答案

如果您使用 DataContractSerializer(这是 WCF 的默认值),您可以序列化任何用 [DataMember] 修饰的属性 - 甚至是只读字段:

[DataContract]
public class VirtualMachineTemplate : VirtualMachineTemplateBase, IXmlPicklable, IEnableLogger
{
    [DataMember]
    ulong _SizeInBytes;
}

但是您需要使用 DataContractSerializer - 而不是 XML 序列化程序。 XML 序列化程序只能序列化公共(public)属性(它会,除非您在它们上放置 [XmlIgnore])。

DataContractSerializer 不同:
  • 它不需要无参数的默认构造函数
  • 它只会序列化你用 [DataMember] 明确标记的内容
  • 但这可以是任何东西——字段、属性和任何可见性(私有(private)、 protected 、公共(public))
  • 它比 XmlSerializer 快一点,但是您无法对 XML 的形状进行太多控制——您只能对所包含的内容发表意见

  • 看到这个blog post这个blog post了解更多提示和技巧。

    马克

    关于只读属性的WCF DataContract序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1343566/

    相关文章:

    .net - 我想分析 WCF 消息

    c# - 做数据库操作时线程是否阻塞?

    .net - Redis 用于频繁更改的市场信息

    Java:我可以使用 JAXB 序列化字符串列表吗?

    vb.net - 如何在 VB.Net 中将 'test service' 页面添加到 WCF Web 服务

    .net - 未处理通过 MSMQ 的较大 WCF 消息

    c++ - 从 Armadillo boost 序列化稀疏矩阵

    php - 如何控制 json_encode 行为?

    java - XStream 中没有已知类类型的注释

    python - 拆分转义分隔符