【问题标题】:NetDataContractSerializer and assembly versions mismatchNetDataContractSerializer 和程序集版本不匹配
【发布时间】:2011-07-20 07:58:10
【问题描述】:

我正在使用 NetDataContractSerializer 在应用程序之间交换数据。我希望 ReadObject 方法在程序集版本不匹配时抛出异常。

现在,例如,当我从程序集版本 1.0.0.0 序列化我的对象,然后使用相同的程序集但现在版本 1.0.0.1 反序列化它时,NetDataContractSerializer 很高兴吞下流并反序列化没有问题。

版本不匹配时是否可以中止反序列化过程?

更新:由于许多原因,我需要版本不容忍。这既是客户的要求,也是绝对确定导入处理从相同版本的应用程序导出的文件的要求。以我的应用为例,更改版本使之前的导入过程毫无用处,因为版本更改或多或少涉及到内部结构的更改。

【问题讨论】:

  • 等等...为什么要引入版本控制不容忍?对于大多数人来说,问题恰恰相反......

标签: c# serialization versioning netdatacontractserializer


【解决方案1】:

丑陋但有效(最好在你的根对象上):

[DataMember]
private string AppVersion {
    get { return CurrentAppVersion; }
    set {
        if(value != CurrentAppVersion) throw new InvalidOperationException(
            "Data from version " + value + " is not compatible");
    }
}
private const string CurrentAppVersion = "1.0.11a";

【讨论】:

  • 这很奇怪...我在这里是因为我遇到了 相反 的问题。它抛出 FileLoadException 因为当我尝试 Deserialize() 时程序集的强名称已更改。
  • @Will:你应该使用FormatterAssemblyStyle.Simple
  • @Will - AssemblyLoad 事件对于修复字符串名称更改很有用
  • @MarcGravell:我并不期待能走得那么深。此外,我不确定 NDCS 是否会尊重这种干预。但是 FormatterAssemblyStyle 有效。
  • @Will 我会放弃基于类型的序列化程序,而且 NDCS 并不是真的那么快,说实话
猜你喜欢
  • 1970-01-01
  • 2014-05-15
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
相关资源
最近更新 更多