【问题标题】:Detecting that a Serializable class has renamed fields/properties检测到 Serializable 类已重命名字段/属性
【发布时间】:2018-04-06 14:32:18
【问题描述】:

当你有一个 [Serializable] 类时,会发生一些变化,例如重新命名属性或字段可能意味着您在新版本中反序列化时会丢失数据。

我正在寻找一种自动检测这些变化的方法,以便手动检查正在发生的事情。因此,可以给定两个 .Net 程序集,在其中找到 Serializable 类并检测潜在的重大更改。

如果它可以忽略通常不是问题的事情,例如添加字段/属性,这是一个奖励,但不是必需的。

对于不可序列化的类来说很好的重构示例,但对可序列化的类会造成重大问题:

// version 1

[Serializable]
class A 
{
    private string _name;
    public string Name 
    { 
       get { return _name;} 
       set {_name = value;}
    }
}

// version 2

[Serializable]
class A 
{
    public string Name { get; set;}
}

我希望这里有一个工具,它可以说明以下内容

Class A - missing field _name
Class A - new property Name

到目前为止我考虑过的事情:

  • 找到所有具有 [Serializable] 属性的类,创建一个实例并对其进行序列化。
    • 除了没有默认构造函数的问题之外,当第一次创建字段/属性为空时,感觉会很困难。
  • 使用反射在每个 [Serializable] 类中查找字段及其类型,并生成按字母顺序排列的列表。
    • 不会处理自定义序列化,感觉方法不对

(如果序列化器本身很重要 - 我们目前使用我们自己的基于 json 的序列化器,它继承自 System.Runtime.Serialization.Formatter,因此它的行为方式与 BinarySerializer 相同)

(编辑) Check whether binary serialized data matches the class which serialized it 是一个类似的问题 - 似乎还没有一个简单的答案

【问题讨论】:

  • 为什么序列化程序会知道_name 的任何信息?或者相信这两个Name 属性是不同的?您要问的是代码分析器,而不是带有序列化的东西。对于序列化程序,您的两个类是相同的。
  • @RonBeyer 很公平;在那种情况下,我收回 - 抱歉
  • @RonBeyer 嗯.. 虽然如果FormatterBinaryFormatter 的基类,它仍然可以是基于字段的!
  • @Stuart 老实说,感觉就像你在尝试解决错误的问题。大多数序列化程序不能在字段级别工作是有原因的。几乎每一个现成的 json 序列化程序都可以正确处理,而无需您做任何事情;许多二进制序列化器(pb-net等)也是如此。老实说,更好地利用您的时间可能很简单:远离这种基于字段的自定义格式化程序。
  • @Evk 和 在那种情况下:大多数序列化程序都有处理它的机制,通常是通过添加属性。但此时:如果您正在更改交换类型/DTO 的公共 API - 您已经知道您应该期待痛苦;这本质上是一个突破性的变化。 fields 的变化更加微妙。

标签: c# .net serialization


【解决方案1】:

如果有人在除法之前删除了检查值为 0 的字符串怎么办?我们使用 UnitTest 对其进行测试。

那么为什么不使用相同的方法呢?您可以对其进行测试或创建一些工具来收集参考数据。该工具会创建包含所有可序列化对象的 xml 输出文件。也许添加一些时间戳等。像这样的东西:

<ObjectName Timestamp="{CreatedDate}">
  <Field Type="int" Name="Id" />
  <Field Type="string" Name="Address" />
</ObjectName>
...

然后 UnitTest(s) 使用此文件通过反射验证程序集。有了这些信息,我们就可以检测字段的变化、删除的字段和新的字段。

【讨论】:

  • 谢谢,我认为我的问题是我没有一种简单的方法来创建每种类型的示例“可序列化对象”。我希望这是一个已解决的问题,并且其他人已经编写了一个工具,而不是我自己编写的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 2016-05-21
相关资源
最近更新 更多