我需要将一些数据序列化为字符串。然后将该字符串存储在数据库中的特殊列 SerializeData 中。
我创建了用于序列化的特殊类。
[Serializable]
public class SerializableContingentOrder
{
public Guid SomeGuidData { get; set; }
public decimal SomeDecimalData { get; set; }
public MyEnumerationType1 EnumData1 { get; set; }
}
序列化:
protected override string Serialize()
{
SerializableContingentOrder sco = new SerializableContingentOrder(this);
MemoryStream ms = new MemoryStream();
SoapFormatter sf = new SoapFormatter();
sf.Serialize(ms, sco);
string data = Convert.ToBase64String(ms.ToArray());
ms.Close();
return data;
}
反序列化:
protected override bool Deserialize(string data)
{
MemoryStream ms = new MemoryStream(Convert.FromBase64String(data).ToArray());
SoapFormatter sf = new SoapFormatter();
SerializableContingentOrder sco = sf.Deserialize(ms) as SerializableContingentOrder;
ms.Close();
return true;
}
现在我想要版本控制支持。如果我更改 SerializableContingentOrder
类会发生什么。我希望将来能够添加新字段。
我必须切换到 DataContract 序列化吗?请给我一个简短的片段?
最佳答案
我强烈主张反对在数据库中存储BinaryFormatter
或SoapFormatter
数据;它是:
- 易碎
- 版本不兼容
- 不独立于平台
BinaryFormatter
适用于 .NET 程序集之间的数据传输(推送),但我建议使用更可预测的序列化程序。 DataContractSerializer
是一个选项(与 JSON
或 XmlSerializer
一样),但我不会使用 NetDataContractSerializer
出于上述所有相同的原因。我会尝试使用 protobuf-net,因为它是一种已知高效格式的高效二进制文件,平台独立且版本兼容!
例如:
[DataContract]
public class SerializableContingentOrder
{
[DataMember(Order=1)] public Guid SomeGuidData { get; set; }
[DataMember(Order=2)] public decimal SomeDecimalData { get; set; }
[DataMember(Order=3)] public MyEnumerationType1 EnumData1 { get; set; }
}
序列化:
protected override string Serialize()
{
SerializableContingentOrder sco = new SerializableContingentOrder(this);
using(MemoryStream ms = new MemoryStream()) {
Serializer.Serialize(ms, sco);
return Convert.ToBase64String(ms.ToArray());
}
}
反序列化:
protected override bool Deserialize(string data)
{
using(MemoryStream ms = new MemoryStream(Convert.FromBase64String(data)) {
SerializableContingentOrder sco =
Serializer.Deserialize<SerializableContingentOrder>(ms)
}
return true;
}
关于c# - 序列化和版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3185294/