2010-06-29 5 views
2

Je rencontre des problèmes lors de la sérialisation d'une instance immutable avec DataContractSerializer, car les propriétés de la classe que je numérote sont des setters manquants. Le problème est que je veux seulement sérialiser l'instance (juste pour qu'elle puisse être écrite dans un journal), et je n'aurai jamais besoin de la désérialiser. Y a-t-il un moyen de contourner ce comportement?Problèmes lors de l'utilisation de DataContractSerializer

La classe que je suis en train de sérialisation:

[DataContract] 
public class Person 
{ 
    private readonly string _name; 

    [DataMember] 
    public string Name 
    { 
     get { return _name; } 
    } 

    public Person(string name) 
    { 
     _name = name; 
    } 
} 

Le code utilisé pour sérialiser la classe:

public string Serialize() 
{ 
    var serializer = new DataContractSerializer(typeof(Person)); 
    StringBuilder stringBuilder = new StringBuilder(); 
    using (XmlWriter writer = XmlWriter.Create(stringBuilder)) { 
     serializer.WriteObject(writer, this); 
    } 
    return stringBuilder.ToString(); 
} 

Répondre

3

Vous pouvez placer le [DataMember] sur les champs vous permettant ainsi d'avoir apporteurs de propriété . Ces champs peuvent toujours être privés. Cependant, il ne peut pas être readonly car il doit construire l'objet puis définir les champs.

[Modifier] Cela entraînera les noms de champs à utiliser sauf si vous utilisez [DataMember(Name = "Name1")]

+0

Merci beaucoup. J'aurais dû y penser avant de poster la question. :) – Patrik

+0

ne sait pas si cela a changé mais dans .net 4.5.1 vous pouvez sérialiser et désérialiser les champs en lecture seule – serine

3

Cette version utilise l'attribut ISerializable au lieu de [DataContract]. Je ne sais pas comment cela va affecter l'opérabilité, mais n'a pas besoin d'un setter public.

[Serializable] 
public class Person : ISerializable 
{ 
    private readonly string _name; 

    public string Name 
    { 
     get { return _name; } 
    } 

    public Person(string name) 
    { 
     _name = name; 
    } 

    public string Serialize() 
    { 
     DataContractSerializer serializer = new DataContractSerializer(typeof(Person)); 
     System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); 
     using (System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(stringBuilder)) 
     { 
      serializer.WriteObject(writer, this); 
     } 
     return stringBuilder.ToString(); 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("Name", _name); 
    } 
} 
Questions connexes