Serialization WCF:使用只读成员序列化复杂对象

Serialization WCF:使用只读成员序列化复杂对象,serialization,Serialization,我正在寻找一些关于WCF服务的指导 我有一个托管在IIS中的WCF服务,它将数据传递给我的客户端。我有一个单独的共享程序集,其中包含WCF项目中引用的所有业务对象 我希望这些业务对象中的一些属性是只读的,因为我不希望我的客户能够更改其客户机代码中的这些字段 我了解到,使用[DataContract]属性装饰类会强制执行适当的序列化以维护只读字段,但当我实现它时,客户机中生成的代理类显示为可写 有什么技巧可以做到这一点吗 谢谢 /Eric根据我的经验,我发现WCF序列化程序只适用于非常简单的对象模

我正在寻找一些关于WCF服务的指导

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

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

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

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

谢谢


/Eric

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

您可以使用常规属性,使用
DataMember
属性标记这些属性,并将设置访问者设置为私有:

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

编辑:另外,为了真正防止类的用户设置属性,您始终可以抛出InvalidOperation异常。

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