由于缺乏任何真正的远见,我使用 NetDataContractSerializer 序列化了大量仅使用 Serializable 修饰的数据,现在我想添加一个新字段。我有哪些选择?
原始类看起来像这样(具有几个继承级别和相当多的字段):
[Serializable]
public class InheritedClass : BaseClass
{
public string StringId { get; set; }
}
现在我想添加另一个属性,比如:
[Serializable]
public class InheritedClass : BaseClass
{
public string StringId { get; set; }
public int IntId { get; set; }
}
现在,当我更新类并进行反序列化时,我收到一个异常,因为新字段不存在,例如:
Exception thrown: 'System.Runtime.Serialization.SerializationException' in System.Runtime.Serialization.dll
Additional information: Error in line 1 position 601. 'Element' '_x003C_StringId_x003E_k__BackingField' from namespace 'http://schemas.datacontract.org/2004/07/QT' is not expected. Expecting element '_x003C_IntId_x003E_k__BackingField'.
好的,这是有道理的,因为 NetDataContractSerializer 需要相同的类。我可以使用 DataMember 属性来解决这个问题,例如:
[DataMember(IsRequired = false)]
那么问题是切换到 DataMember(正如我应该预先做的那样,或者使用不同的序列化程序)会改变隐式的字母顺序,然后我的大部分字段将不会像众所周知的那样默默地反序列化。
我试图手动添加与磁盘上的排序一致的排序(通过Order
属性上的属性),但这似乎也没有得到尊重。(我也没有在原始 xml 中看到可以匹配的订单值。)
除了写一些东西来加载 xml 并插入丢失的节点之外,还有其他选择吗?(或者等效地设置一个并行类型并从一个重新序列化到另一个反序列化?)如果没有,我可能只是加载当前类型并反序列化到 JsonNet 或 protobuf,但我是否缺少使用 DataMember/ 更直接的东西ETC?