【问题标题】:WCF: Serialize complex objects with read-only membersWCF:使用只读成员序列化复杂对象
【发布时间】:2009-11-09 18:23:08
【问题描述】:

寻找有关我正在制作原型的 WCF 服务的一些指导。

我有一个托管在 IIS 中的 WCF 服务,它将向我的客户端传递数据。我有一个单独的共享程序集,其中包含我在 WCF 项目中引用的所有业务对象。

我希望这些业务对象中的一些属性只读,因为我不希望我的客户能够更改其客户端代码中的这些字段。

我读到使用 [DataContract] 属性装饰类会强制执行正确的序列化以维护只读字段,但是当我实现它时,客户端中生成的代理类显示为可写。

有什么技巧可以做到这一点吗?

谢谢!

/埃里克

【问题讨论】:

    标签: serialization


    【解决方案1】:

    您可以使用常规属性,用 DataMember 属性标记它们并将 set 访问器设为私有:

            [DataMember]
            public object IsFoo
            {
                get
                {
                   return _isFoo;
                }
                private set { }
            }
    

    编辑:另外,为了真正防止你的类的用户设置属性,你总是可以抛出一个 InvalidOperation 异常。

    【讨论】:

    • 所以我尝试了这条路线(如下),但是当我进入客户端并使用代理对象时,我仍然可以“设置”该值。私有字符串 strAdUrlTec; [DataMember] 公共字符串 AdUrlTec { 获取 { 返回 strAdUrlTec; } 私有集 { } }
    • 你是如何设置属性的?从哪里 - 它在拥有类内部?如果它在外面,你应该得到一个编译错误!
    • 我不是从所属类设置它。我有一个 WCF 服务项目,它引用了我的业务对象所在的外部程序集(特别是我们正在谈论的那个)。我有一个使用 WCF 服务的单元测试项目。因此,在我的单元测试中,我从 WCF 服务中拉下一个对象,然后更改 AdUrlTec 属性,它让我可以。上周我看到另一个线程使用相同的解决方案,所以我认为你是对的,但我想知道为什么我的实现不尊重私有设置器。 :(
    • 我唯一能想到的是单元测试模块使用反射设置属性——这确实允许你绕过私有修饰符......
    • 此外,在您在第一条评论中发布的示例中 - 即使有人设置了该属性,它实际上也不会做任何事情,因为 set 访问器是空的。另一种解决方案是在 set 访问器中抛出异常。
    【解决方案2】:

    根据我的经验,我发现 WCF 序列化程序仅适用于非常简单的对象模型。如果您计划通过网络传递您的业务或领域对象,您可能需要考虑创建“传输”对象中的支架。该对象将使您能够准确控制消费者接收的内容,并且可以映射回您的域对象。

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多