【问题标题】:Serializing TypeInfo / Type across .Net Platforms跨 .Net 平台序列化 TypeInfo / Type
【发布时间】:2015-06-07 21:18:46
【问题描述】:

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

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

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

问题源于这样一个事实:在运行时的 .Net 4.5 中,Type 引用上的GetType() 将返回RuntimeType,它派生自TypeInfo,它派生自TypeMemberInfo等等.. 所以当在 .Net 4.5 中运行时,对象将是 both TypeTypeInfo。没关系,也无法区分它们

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

重要的原因是用户和序列化程序本身总是希望反序列化与先前序列化的相同类型的对象,但是因为在 .Net 4.5 中无法区分 TypeTypeInfothis在 Windows 应用商店应用反序列化期间缺少信息。做出有利于其中一种类型的选择会导致在预期另一种类型时出现错误,并且无法预测预期哪种类型。

有没有办法解决这个问题?

到目前为止,我一直在考虑各种选项,例如在整个序列化程序代码中分散大量“隐式强制转换”之类的检查和转换,但这并不能真正涵盖所有情况,尤其是涉及毫无戒心的用户的情况谁会得到错误类型的对象.. 对此的任何建议或经验将不胜感激!

【问题讨论】:

  • 强烈建议使用protcol buffersservicestack 或类似的东西,这样这一切都变得与平台无关。
  • 使用库将如何解决我面临的一些“基本”问题?如果他们能解决它,我需要知道如何解决我自己的问题——完全切换序列化系统不是一个可行的选择。
  • Protocol buffers 等使序列化平台与平台无关。有效负载将是一个字节流,然后由接收端将其反序列化为已知类型。 (自动)生成类型的合同由遵循 protobuf 标准的protobuf 编译器处理(Jon Skeet 编写了一个版本,Marc Gravell 编写了另一个版本,用于 .NET)。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 2012-01-18
    相关资源
    最近更新 更多