【发布时间】: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 嗯.. 虽然如果
Formatter是BinaryFormatter的基类,它仍然可以是基于字段的! -
@Stuart 老实说,感觉就像你在尝试解决错误的问题。大多数序列化程序不能在字段级别工作是有原因的。几乎每一个现成的 json 序列化程序都可以正确处理,而无需您做任何事情;许多二进制序列化器(pb-net等)也是如此。老实说,更好地利用您的时间可能很简单:远离这种基于字段的自定义格式化程序。
-
@Evk 和 在那种情况下:大多数序列化程序都有处理它的机制,通常是通过添加属性。但此时:如果您正在更改交换类型/DTO 的公共 API - 您已经知道您应该期待痛苦;这本质上是一个突破性的变化。 fields 的变化更加微妙。
标签: c# .net serialization