跨.Net平台序列化TypeInfo / Type

时间:2015-06-07 21:18:46

标签: c# serialization reflection windows-store-apps portable-class-library

我正在将常规的.Net 4.5库移植到可移植类库配置文件111中 - 其中包括Windows应用商店,Windows Phone,Xamarin.Android和Xamarin.iOS以及Desktop。该框架的一部分是自定义序列化系统,以处理.Net的一些限制。

数据将跨平台序列化,这意味着我可能会在桌面上序列化运行在.Net 4.5中的对象,并在Windows应用商店应用中对其进行反序列化。这个事实与Evolved Reflection API相结合,会对Type和TypeInfo 造成一个令人遗憾的序列化问题。

在正常操作中,序列化程序使用GetType向对象询问其类型,并根据该值确定如何继续。如果结果是对Type的引用,则序列化的字符串ID可用于在反序列化期间解析Type,其他情况的处理方式不同。由于序列化程序还处理有关每个序列化对象的元数据,因此您永远不需要告诉它您期望的对象类型,而是按原样接收完全反序列化的对象。

问题产生于以下事实:在.Net 4.5运行时,GetType()引用上的Type将返回RuntimeType,它派生自TypeInfo,派生自Type来自MemberInfoType等等。因此,当在.Net 4.5中运行时,该对象将 TypeInfoType。它也不重要,也不可能区分它们

Inheritance tree in .Net 4.5 vs. Windows Store

但是,在Windows应用商店应用中反序列化数据流时并非如此,其中TypeInfoType是完全不同的类。解析字符串ID时应该检索哪一个? TypeInfoType

重要的是,用户和序列化程序本身都希望反序列化先前序列化的同类对象,但因为{。1}}和TypeInfo无法在.Net 4.5中区分,在Windows应用商店应用中反序列化期间缺少此信息。做出选择以支持其中一种类型会在预期另一种类型时导致错误,并且无法预测哪一种是预期的。

有什么方法可以解决这个问题吗?

到目前为止,我一直在考虑各种选项,比如在整个序列化程序代码中散布很多“隐式转换”式检查和转换,但这并不能涵盖所有情况,特别是涉及毫无戒心用户的情况谁会得到一个错误类型的对象..对此的任何建议或经验都将受到高度赞赏!

1 个答案:

答案 0 :(得分:0)

使用条件编译来了解LightInject如何处理这种情况。