这种WCF序列化方法是否合理?

时间:2012-09-27 21:04:21

标签: wcf serialization deserialization

我正在考虑使用WCF来做客户端/服务器,UI /数据库层,我认为我会使用WCF服务来读取DataRow,填充类的属性然后将其返回给UI客户端(这是Windows的端到端)。

我从一个DLL中的类开始,并在UI和服务器之间共享DLL。服务器读取DataRow,类知道如何从DataRow填充自己。该类具有带有私有后备变量的公共属性,但是当从DataRow填充时,该类直接写入后备变量。然后将类的实例传递回UI。

UI反序列化该类。该类具有公共属性,并且setter都执行INotifyPropertyChanged以支持绑定。到目前为止,没有正常的。

我从[DataContract]和[DataMember]属性开始,但注意到当我的对象的一个​​实例在UI处被反序列化时,它会调用该类实例的公共属性设置器 - 这反过来会触发一个每个房产的'已经改变'事件。

为了解决这个问题,我读到我可以使用IXmlSerializer。所以我删除了属性,并支持IXmlSerializer接口,使用ReadXml()方法直接写入公共属性后面的支持变量。

这一切都很好(除了现在必须有一个无参数构造函数),但它是否合理?这是事情应该如何运作?

我是否应该拥有一个共享类,它从UI中了解INotifyPropertyChanged,以及从服务器端知道如何从DataRow构建自身。我应该将所有逻辑放在其他地方,并使用XSD定义类吗?

麻烦的是,我可以解决我遇到的问题(比如如何反序列化可空类型),但我不确定没有更好的方法。我没有可预见的需要支持除Windows到Windows WCF通信之外的任何东西,所以我实际上并不关心XML的样子(或者它是否存在)。

非常感谢指针。

感谢。

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是在服务器端维护合同(可通过[DataContract],[DataMember]进行序列化)和客户端的实体。任何给定的服务方法都将返回合同,但您不会直接调用该服务。相反,在中间放置一个代理。代理将调​​用服务方法,从契约转换为实体,然后返回实体。

这样,您的前端只关注其实体(因为它只与代理进行通信 - 从不直接与服务进行对话),并且根本不必担心合同。而且你不必做自己的时髦序列化工作:)