Ceci est une ancienne révision du document !
Table des matières
Préparation des classes
[DataContract] class BatchPoco { [DataMember] public String Valeur { get; private set; } }
Tous les éléments sérialisés doivent être DataContract
. Donc si une classe fait référence à une autre classe non native, il faut aussi la déclarer :
[DataContract] class Class1 { [DataMember] public String Valeur1 { get; private set; } } [DataContract] class Class2 { [DataMember] public Class1 Valeur2 { get; private set; } }
On peut aussi avoir des boucles : la classe 1 dépend de la 2 et inversement. Dans ce cas, il faut indiquer qu'il ne faut pas sérialiser tous les éléments mais qu'il faut préserver les références (liens).
[DataContract(IsReference = true)] class Class1 { [DataMember] public Class2 Valeur1 { get; private set; } } [DataContract(IsReference = true)] class Class2 { [DataMember] public Class1 Valeur2 { get; private set; } }
<note important>IsReference
ne marche qu'avec la sérialisation au format XML, pas JSON.</note>
- Héritage
Si on souhaite sérialiser une classe dont un des champs n'est renseigné que par un parent ou une interface, il faut déclarer explicitement tous les types de classes.
[DataContract] class IAnimal{} [DataContract] class Chat : IAnimal{} [DataContract] class Chien : IAnimal{} [DataContract] [KnownType(typeof(Chat))] [KnownType(typeof(Chien))] class Foret { [DataMember] List<IAnimal> faune; }
Sans KnownType
, il va y avoir une erreur :
Type 'XXXX' with data contract name 'YYYY' is not expected. Add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.
Exception during the serialization - Type with data contract name is not expected Archive du 04/03/2019
Sérialisation en XML
- Charger
using (FileStream fs = new FileStream(fileName, FileMode.Open)) { DataContractSerializer ser = new DataContractSerializer(typeof(BatchPoco)); using (XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas())) { using (MemoryStream ms = new MemoryStream()) { _batch = (BatchPoco)ser.ReadObject(reader, true); } } }
- Enregistrer
using (MemoryStream ms = new MemoryStream()) { DataContractSerializer ser = new DataContractSerializer(typeof(BatchPoco)); ser.WriteObject(ms, _batch); byte[] xml = ms.ToArray(); using (FileStream fs = new FileStream(fileName, FileMode.Create)) { fs.Write(xml, 0, xml.Length); } }
Sérialisation en JSON
C'est la même chose avec DataContractJsonSerializer
.
Procédure : Sérialiser et désérialiser des données JSON Archive du 04/03/2019