c# - 序列化和版本控制

标签 c# .net serialization versioning

我需要将一些数据序列化为字符串。然后将该字符串存储在数据库中的特殊列 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 序列化吗?请给我一个简短的片段?

最佳答案

强烈主张反对在数据库中存储BinaryFormatterSoapFormatter 数据;它是:

  • 易碎
  • 版本不兼容
  • 不独立于平台

BinaryFormatter 适用于 .NET 程序集之间的数据传输(推送),但我建议使用更可预测的序列化程序。 DataContractSerializer 是一个选项(与 JSONXmlSerializer 一样),但我不会使用 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/

相关文章:

c# - 这种方法是从 C# 获取 SQL 值的好方法吗?

c# - Paypal IPN 获取 405 : method not allowed

c# - 使用 Sleep 模拟 Thread Yield 方法

c# - Azure CloudBlobStream 序列化(使用 Json.NET)

java - 是否可以在不复制 Set 的情况下序列化 Map.keySet ?

c# - 如何使用C#将两个音频文件和一个视频文件合并为一个视频文件?

c# - 数据为空。试图获得 8AM 和 CurrentTime 的 TIMESTAMPDIFF

c# - 图元文件到 Multi-Tiff 图像

c# - C# 中从 MemoryStream 反序列化抛出 OutOfMemory 异常

c# - cocoa 的属性网格