【发布时间】:2010-04-05 23:14:51
【问题描述】:
我正在编写一些软件来修改 Windows Server 的配置(例如 MS-DNS、IIS、文件系统的一部分)。我的设计有一个构建服务器配置状态的内存对象图的服务器进程和一个请求该对象图的客户端。然后,服务器将序列化该图,将其发送到客户端(可能使用 WCF),然后服务器对该图进行更改并将其发送回服务器。服务器接收到图形并继续对服务器进行修改。
但是,我了解到 WCF 中的对象图序列化并不像我最初想象的那么简单。我的对象具有层次结构,并且许多对象具有参数化构造函数和不可变的属性/字段。还有许多集合、数组和字典。
我对 WCF 序列化的理解是它需要使用 XmlSerializer 或 DataContractSerializer,但 DCS 对我的对象图的设计施加了限制(不可变数据似乎是正确的,它还需要无参数的构造函数)。我了解 XmlSerializer 允许我使用我自己的类,只要它们实现 ISerializable 并具有反序列化器构造函数。这对我来说很好。
我和我的一个朋友谈过这件事,他主张采用仅数据传输对象的路线,我必须维护一个单独的 DataContract 对象图来传输数据并重新实现我的服务器客户端上的对象。
我的另一个朋友说,因为我的服务只有两个操作(“GetServerConfiguration”和“PutServerConfiguration”),所以完全跳过 WCF 并实现我自己的使用 Sockets 的服务器可能是值得的。
所以我的问题是:
- 以前有没有人遇到过类似的问题,如果有,有更好的方法吗?将整个对象图发送到客户端进行处理是否明智?我是否应该将其分解,以便客户端根据需要请求对象图的一部分并仅发送已更改的位(从而减少与并发相关的风险?)?
- 如果向下发送对象图是正确的方法,那么 WCF 是正确的工具吗?
- 如果 WCF 是正确的,那么让 WCF 序列化我的对象图的最佳方法是什么?
【问题讨论】:
-
当您说图时,您指的是无向图,其中多个节点可以链接到许多其他节点?如果是这样,WCF 会为对象分配正确的值。因此,您的一个节点最终可能会得到与预期不同的值.....如果这就是您所说的图表。
-
嗯,例如,发送的对象之一是我写的一个代表DNS区域的类,这个类包含一个DNS资源记录列表,并且这些RR对象引用了它们的父DNS区。所以它是一个循环有向图。
-
实际上恰恰相反——XmlSerializer 需要一个无参数的构造函数,而 DataContractSerializer 不需要
标签: c# wcf serialization