【问题标题】:WCF Xml/Json serialization of domain objects, what exactly is getting serialized?域对象的 WCF Xml/Json 序列化,究竟是什么被序列化?
【发布时间】:2012-08-31 17:27:11
【问题描述】:

我有一个域类 User,它至少有 20 个属性,它来自另一个库,所以它没有任何契约修饰。当我通过 WCF 服务将其作为 xml 或 json 返回时,它只会带回 3 个属性。我想也许它遗漏了集合和诸如此类的东西,但即使是像姓名和电子邮件这样的简单字段也根本没有返回。

所以我想我的问题是,有人能解释一下究竟是什么被序列化并通过服务返回吗?所有属性都没有用 [DataMember] 之类的东西装饰,但有些属性被序列化并返回,而另一些则没有。据我了解,它应该自动序列化所有公共属性。另一方面,如果有人能指出如何将这些声明添加到现有库以协助序列化的正确方向,我将不胜感激。

更新: 我正在查看 wsdl 并找到对 xsd 文件的引用(假设由序列化程序生成)。我注意到我只有那 3 个 [映射] 列出的字段。不知道这是什么,或者我能不能弄乱它。

【问题讨论】:

    标签: c# .net wcf serialization


    【解决方案1】:

    事实证明,这些属性没有被序列化的原因是因为它们不是完全公开的,因为它们是只读的。我实际上将属性设置为:

    public string MyProperty { get; internal set; }
    

    我这样做是因为我确实在我的内部系统类(控制器类型的东西)中使用了对象初始化器,并且不希望允许消费者设置这些属性。我读到您可以将它们设置为受保护,它会允许它序列化,但这不适用于我的实现。

    这些是 POCO 类,所以我的解决方案(虽然不是完全解决问题的答案)是创建 DTO 类。由于 DTO 中的所有属性都是完全公开的,所以我所做的就是使用来自 POCO 的数据填充这些属性并返回 dto。一切都被正确序列化了。

    【讨论】:

      【解决方案2】:

      查看您的域类,看看它是否继承自另一个类。如果是,那么 User 类可能只有您看到的三个属性。

      我发现行之有效的方法是创建一个特殊的服务模型(或视图模型)作为公共数据接口,而不是与域模型的直接接口。作为一个好处,您可以更好地控制可能暴露的数据 - 您可以限制意外数据泄漏的风险,并优化通过网络发送的数据。

      祝你好运!

      【讨论】:

      • 我的 User 类不继承任何东西(当然除了对象)。我明白你在做什么,基本上是建议一个 DTO。这是一个选项,但感觉没有必要。
      猜你喜欢
      • 1970-01-01
      • 2021-10-16
      • 2020-11-08
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      相关资源
      最近更新 更多