【发布时间】:2009-08-19 14:14:19
【问题描述】:
我有一个可以正常工作的 ChangeTrackingList 实现,它可以很好地完成它的工作,但我想在将它从客户端发送回服务器时“过滤”它的内容,以便它只包含更改。获取更改很容易,因为我的列表为此目的公开了一个 GetChanges 方法。如何中断 DataContractSerializer 并替换 List 曾经所在的 List.GetChanges()?
更多细节: 考虑一个父/子关系,其中我有一个父级和多个子级,每个子级都有一个对父级的引用,例如客户/订单。将整个子列表序列化到客户端应用程序很好,因为我需要显示所有订单。当我保存时,我不想将所有订单都带回服务器,但是,只是更改。
难度: 我已经研究过实现 ISerializable 和实现我自己的 GetObjectData,如果不是因为我还需要保留对象引用这一事实,这不会很难。如果我将 DataContractSerializer 指向我的图表,并启用 PreserveObjectReferences(通过添加行为或显式通过构造函数),我将得到一个非常漂亮的图表,没有重复,但它需要包含我的整个 ChangeTrackingList。如果我实现 ISerializable,我可以手动写出我的 ChangeTrackingList,并且只包含更改,但那些子对象将不再知道它们的父引用。
说明: 这是一个高度简化的示例,旨在说明问题。我不是在寻找这个特定问题的替代解决方案。我的实际问题不以任何方式涉及客户、订单或订单项。客户/订单问题的替代解决方案不是我要寻找的答案。
很简单,我正在寻找一种仅序列化对象图“有趣”部分的方法。识别和过滤到“有趣”的机制已经完成,我只需要在序列化期间将这些部分替换到对象图中。
另一个例子: 假设我们有一个“Person”实体,它下面有一组“Phone”实体。电话没有父母是无效的,业务规则说一个人没有至少一部电话是无效的。我不能简单地保存这个人,然后在两个单独的电话中保存电话,因为每个电话都会出错。我必须在一次调用中将它们保存为图表。稍后,如果我更新 Person 以更改其存储在 Person 上的地址,并添加新的电话号码,我需要将更新后的人员以及对电话列表的更改发送。我不想发送原来的手机,因为它没有改变。
这又是一个人为的例子,但更接近于现实生活中的问题。我的父母至少没有一个孩子是无效的,没有父母的孩子是无效的。
更新: 看起来我想要执行的“替换”可以通过 DataContractSurrogate 类来完成。我见过一些这样的例子,它们相对简单,但那是因为它们的例子也是如此。它们通常属于“Swap EmployeeSurrogate for Employee”种类,其中“Employee”是一些不可序列化的类。就我而言,事情变得更奇怪了,因为我要交换的类是泛型类型。
所以,问题的一个更简单的版本可能是这样的。假设我有一个完全不可序列化的 MyList 类。 (在有人提出建议之前,替换 MyList 类也不是一个有效的解决方案。请记住,这只是一个示例。)我想设置一个 DataContractSurrogate ,以便每当 MyList 出现在我的对象图中,我想转换将其转换为一个简单的数组进行序列化。
这听起来对任何人来说都是一个有效的方向吗?有没有人尝试过代理泛型类型?考虑到它我是不是疯了?
【问题讨论】:
标签: .net wcf serialization