Outils pour utilisateurs

Outils du site


lang:csharp:serialisation

Ceci est une ancienne révision du document !


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

Understanding Known Types 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);
  }
}

DataContractSerializer, exemple Archive du 04/03/2019

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

lang/csharp/serialisation.1551698621.txt.gz · Dernière modification : 2019/03/04 12:23 de root