首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >序列化和版本化

序列化和版本化
EN

Stack Overflow用户
提问于 2010-07-06 18:11:00
回答 4查看 11.8K关注 0票数 5

我需要将一些数据序列化为字符串。然后将该字符串存储在DB中的一个特殊列SerializeData中。

我已经创建了用于序列化的特殊类。

代码语言:javascript
复制
[Serializable]
public class SerializableContingentOrder
{
    public Guid SomeGuidData { get; set; }
    public decimal SomeDecimalData { get; set; }
    public MyEnumerationType1 EnumData1 { get; set; }
}

序列化:

代码语言:javascript
复制
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;
}

反序列化:

代码语言:javascript
复制
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序列化吗?能给我一小段吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-06 18:25:25

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

  • brittle
  • not版本容错
  • not platform

对于.NET程序集之间的数据传输(在推送时),BinaryFormatter是可以的,但我建议您使用更可预测的序列化程序。DataContractSerializer是一个选项(就像JSONXmlSerializer一样),但出于上面所有相同的原因,我不会使用NetDataContractSerializer。我很想使用protobuf-net,因为它是已知高效格式的高效二进制文件,与平台无关,并且具有版本容忍性!

例如:

代码语言:javascript
复制
[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; }
}

序列化:

代码语言:javascript
复制
protected override string Serialize()
{
    SerializableContingentOrder sco = new SerializableContingentOrder(this);   
    using(MemoryStream ms = new MemoryStream()) {
        Serializer.Serialize(ms, sco);
        return Convert.ToBase64String(ms.ToArray());
    }
}

反序列化:

代码语言:javascript
复制
protected override bool Deserialize(string data)
{
    using(MemoryStream ms = new MemoryStream(Convert.FromBase64String(data)) {
        SerializableContingentOrder sco =
               Serializer.Deserialize<SerializableContingentOrder>(ms)
    }
    return true;
}
票数 11
EN

Stack Overflow用户

发布于 2010-07-06 18:30:55

如果你想支持版本控制,你有两个选择。使用DataContracts或使用版本容错序列化。两者都是有效的。

DataContacts自动处理字段的添加和删除。有关详细信息,请参阅Data Contact VersioningBest Practices: Data Contract Versioning

DataContact示例

代码语言:javascript
复制
[DataContract]
public class ContingentOrder
{
    [DataMember(Order=1)]
    public Guid TriggerDealAssetID;

    [DataMember(Order=2)]
    public decimal TriggerPrice;

    [DataMember(Order=3)]
    public TriggerPriceTypes TriggerPriceType;

    [DataMember(Order=4)]
    public PriceTriggeringConditions PriceTriggeringCondition;

}

版本容错序列化示例

代码语言:javascript
复制
// Version 1
[Serializable]
public class SerializableContingentOrder
{
    public Guid TriggerDealAssetID;
    public decimal TriggerPrice;
    public TriggerPriceTypes TriggerPriceType;
    // Omitted PriceTriggeringCondition as an example
}

// Version 2 
[Serializable]
public class SerializableContingentOrder
{
    public Guid TriggerDealAssetID;
    public decimal TriggerPrice;
    public TriggerPriceTypes TriggerPriceType;

    [OptionalField(VersionAdded = 2)]
    public PriceTriggeringConditions PriceTriggeringCondition;

    [OnDeserializing]
    void SetCountryRegionDefault (StreamingContext sc)
    {
        PriceTriggeringCondition = /* DEFAULT VALUE */;
    }

}

有关版本容错序列化的更多信息(链接已断开)。尤其要注意页面底部的最佳实践。

请注意,DataContracts是在.NET 3.5中引入的,因此如果您需要面向.NET 2.0,则可能没有该选项。

HTH,

票数 7
EN

Stack Overflow用户

发布于 2010-07-06 18:16:24

从.NET 2.0开始,如果使用BinaryFormatter,就可以支持版本容错序列化。SoapFormatter还支持一些版本容错功能,但不是BinaryFormatter支持的所有功能,更具体地说,不支持外部数据容错。

有关更多信息,请查看:

Version Tolerant Serialization

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3185294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档