【问题标题】:WCF DataContractsWCF 数据合同
【发布时间】:2010-09-15 10:04:41
【问题描述】:

我有一个为内部客户端托管的 WCF 服务 - 我们可以控制所有客户端。因此,我们将使用数据合约库来消除对代理生成的需求。我想使用一些只读属性并有一些没有默认构造函数的数据合同。 感谢您的帮助...

【问题讨论】:

    标签: .net wcf datacontract serialization


    【解决方案1】:

    只要您将(非只读)字段标记为 [DataMember],而不是属性,就可以使用只读属性。与 XmlSerializer 不同,IIRC DataContractSerializer 不使用默认 ctor - 它使用单独的反射机制来创建未初始化的实例。除了在 mono 的“Olive”(WCF 端口)上,它确实使用默认 ctor(目前,或在最近的某个时间点)。

    例子:

    using System;
    using System.IO;
    using System.Runtime.Serialization;
    [DataContract]
    class Foo
    {
        [DataMember(Name="Bar")]
        private string bar;
    
        public string Bar { get { return bar; } }
    
        public Foo(string bar) { this.bar = bar; }
    }
    static class Program
    {
        static void Main()
        {
            DataContractSerializer dcs = new DataContractSerializer(typeof(Foo));
            MemoryStream ms = new MemoryStream();
            Foo orig = new Foo("abc");
            dcs.WriteObject(ms, orig);
            ms.Position = 0;
            Foo clone = (Foo)dcs.ReadObject(ms);
            Console.WriteLine(clone.Bar);
        }
    }
    

    【讨论】:

    • 好的,这很有道理。我找不到任何关于此的文档,并认为我已经阅读过需要默认构造函数。这很好用!谢谢...
    • 如果你有一个简单的后备属性,这很好,但如果只读属性类似于 public string FooBar { get {return Foo + ' ' + Bar; }} datacontract 序列化程序如何处理这种情况?
    • @lomaxx,好吧,除非你把它标记为[DataMember],否则它什么也不会做;但这是一个只读属性,所以我希望它要么忽略你,要么抛出异常。如果你有一个 getter 和 setter,它会做你的代码要求它做的任何事情。
    • 仅供参考,DataContractSerializer 有一个 SerializeReadOnlyTypes 设置(从框架 4.5 开始)msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2011-10-14
    相关资源
    最近更新 更多