Lambdas,封闭变量,显示类,可序列化和普遍性层

时间:2011-01-19 08:06:23

标签: c# .net serialization compact-framework object-persistence

我已经为Compact Framework实现了普遍性层(包括BinaryFormatter - 就像序列化器一样)。我希望能够序列化由lambda和迭代器之类的东西产生的编译器生成的类,如果(例如)lambda及其封闭变量(即显示类实例)被添加到可序列化对象的事件中,并且所有已关闭的变量都是可序列化的,然后生成的对象图仍然是完全可序列化的。

这些类的实例只能通过序列化的二进制文件的完全相同的构建进行反序列化是可接受的 - 如果应用程序意外终止,则流行层主要是为了提供持久性(电源故障和设备重启是不同的可能性),并且序列化数据流不应该是向前或向后兼容的,或者甚至在相同源代码的两个编译中兼容的事情 - 所有后果都将被发送无论如何,当我们下次与它通话时,我们不会在断开连接时更新。

在这个有限的上下文中,格式化程序将这些编译器生成的类视为可序列化是否合理?我看到的唯一选择是手工实现其他地方可编译支持的模式,其中可串行化是一个问题,其后果从过于冗长到几乎不可读。

1 个答案:

答案 0 :(得分:2)

我看到你得到了什么,但根据我的经验,专注于序列化数据,并通过回滚/转发到已知状态来处理持久性是一个更好的主意,也许使用类似于本地CQRS队列,或者其他一些存储“你如何到达那里”的方式。

回答具体问题,在问题的严格范围内(仅适用于相同的构建等)我猜测应该没问题,但这很大程度上取决于是否 在这些变量中捕获的任何内容没有合理的序列化 - 即类似于UI元素(很容易被隐形this捕获)的东西,这是不可能的重建(os句柄等)。如果它是孤立数据(我的意思是:图表只是你自己代码中的数据 - 没有非托管依赖项),那么我猜它应该没问题。

另一个问题是CF缺乏完整框架中可用的强大反射,这可能会使它比常规框架(例如GetUninitializedObject)更加尴尬。可能是可行的,但还有一点工作。