Sérialisation et versioning

J’ai besoin de sérialiser des données en chaîne. La chaîne est ensuite stockée dans la firebase database dans une colonne spéciale SerializeData.

J’ai créé des classes spéciales utilisées pour la sérialisation.

[Serializable] public class SerializableContingentOrder { public Guid SomeGuidData { get; set; } public decimal SomeDecimalData { get; set; } public MyEnumerationType1 EnumData1 { get; set; } } 

Sérialisation:

 protected override ssortingng Serialize() { SerializableContingentOrder sco = new SerializableContingentOrder(this); MemoryStream ms = new MemoryStream(); SoapFormatter sf = new SoapFormatter(); sf.Serialize(ms, sco); ssortingng data = Convert.ToBase64Ssortingng(ms.ToArray()); ms.Close(); return data; } 

Désérialisation:

 protected override bool Deserialize(ssortingng data) { MemoryStream ms = new MemoryStream(Convert.FromBase64Ssortingng(data).ToArray()); SoapFormatter sf = new SoapFormatter(); SerializableContingentOrder sco = sf.Deserialize(ms) as SerializableContingentOrder; ms.Close(); return true; } 

Maintenant, je veux avoir un support de versioning. Que se passe-t-il si je change de classe SerializableContingentOrder ? Je veux pouvoir append de nouveaux champs dans le futur.

Dois-je passer à la sérialisation DataContract? S’il vous plaît donnez-moi un court extrait?

Je recommande vivement de ne pas stocker les données BinaryFormatter ou SoapFormatter dans la firebase database; il est:

  • fragile
  • non tolérant à la version
  • pas indépendant de la plateforme

BinaryFormatter est acceptable pour le transfert de données entre assemblys .NET (en un clic), mais je recommanderais un sérialiseur plus prévisible. DataContractSerializer est une option (comme JSON ou XmlSerializer ), mais je n’utiliserais pas NetDataContractSerializer pour les mêmes raisons que ci-dessus. Je serais tenté d’utiliser protobuf-net, car c’est un binary efficace dans un format efficace connu, indépendant de la plate-forme et tolérant la version!

Par exemple:

 [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; } } 

Sérialisation:

 protected override ssortingng Serialize() { SerializableContingentOrder sco = new SerializableContingentOrder(this); using(MemoryStream ms = new MemoryStream()) { Serializer.Serialize(ms, sco); return Convert.ToBase64Ssortingng(ms.ToArray()); } } 

Désérialisation:

 protected override bool Deserialize(ssortingng data) { using(MemoryStream ms = new MemoryStream(Convert.FromBase64Ssortingng(data)) { SerializableContingentOrder sco = Serializer.Deserialize(ms) } return true; } 

Vous avez deux options si vous souhaitez prendre en charge le versioning. Utilisez DataContracts ou utilisez la sérialisation à tolérance de version. Les deux sont valables.

DataContacts gère l’ajout et la suppression de champs automatiquement. Voir Gestion des versions du contact de données et pratiques recommandées: Gestion des versions de contrat de données pour plus d’informations.

Exemple DataContact

 [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; } 

Exemple de sérialisation à tolérance de version

 // 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 */; } } 

Plus d’informations sur la sérialisation à tolérance de version . Surtout, prenez note des meilleures pratiques au bas de la page.

Remarque: DataContracts a été introduit dans .NET 3.5. Par conséquent, il est possible que vous ne puissiez pas utiliser cette option si vous devez cibler .NET 2.0.

HTH,

Depuis .NET 2.0, vous disposez de la prise en charge de la sérialisation à tolérance de version si vous utilisez BinaryFormatter . SoapFormatter prend également en charge certaines fonctionnalités tolérantes à la version, mais pas toutes celles sockets en charge par BinaryFormatter .

Pour plus d’informations, vous devriez vérifier:

Sérialisation à tolérance de version

Le moyen le plus simple consiste à décorer de nouveaux champs avec OptionalFieldAtsortingbute . Ce n’est pas parfait, mais cela pourrait faire l’affaire.