由于缺乏任何真正的远见,我已经使用 NetDataContractSerializer 序列化了仅使用 Serialized 修饰的大量数据,现在我想添加一个新字段。我有什么选择?
原始类看起来像这样(具有几个继承级别和相当多的字段):
[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?