2010-02-25 3 views
30

J'ai un C# POCO régulier. Au niveau de la classe, je décore l'objet avec [Serializable()]. Cela dit, j'utilise le Linq Sum() sur l'une des propriétés et je reçois une erreur lors de la sérialisation. Si possible, j'aimerais simplement ignorer cette propriété. Cependant, le [XmlIgnore()] est uniquement pour la sérialisation Xml, pas binaire. Des idées ou des pensées?Ignorer la sérialisation binaire sur une propriété

Le code est quelque chose comme ça, où je voudrais ignorer ValueTotal:

[Serializable()] 
public class Foo 
{ 
    public IList<Number> Nums { get; set; } 

    public long ValueTotal 
    { 
    get { return Nums.Sum(x => x.value); } 
    } 
} 
+11

Notez le point répété dans les réponses; BinaryFormatter ne se soucie pas des propriétés en premier lieu ... –

Répondre

-11

Cheat et utiliser une méthode

[Serializable()] 
public class Foo 
{ 
    public IList<Number> Nums { get; set; } 

    public long GetValueTotal() 
    { 
    return Nums.Sum(x => x.value); 
    } 
} 
+1

+1 alors que j'ai parfois des difficultés avec les propriétés étant égales à l'état, et l'état est parfois calculé, je commence à être plus d'accord que si vous faites des calculs, alors vous devrait utiliser une méthode car elle montre l'intention que cette valeur est le résultat d'un calcul. La vérité est, pourquoi voudriez-vous sérialiser une valeur qui est calculée, ne devriez-vous pas sérialiser les données que vous voulez, et puis juste refaire le calcul de l'autre côté? – NerdFury

+0

Je suis d'accord NerdFury, cela communique mieux mes intentions. Je vous remercie. -Jessy Houle –

+0

Comment cela résout-il le problème "recevoir une erreur lors de la sérialisation"? J'ai supposé que le nombre n'était pas sérialisable et que la sérialisation du champ de sauvegarde de la propriété Nums échouerait. – Henrik

32

    [NonSerialized] 
    private IList<Number> nums; 
    public IList<Number> Nums { get {return nums;} set { nums = value; } } 
+1

Relire. Il aime ignorer la propriété ValueTotal, pas la liste – Scoregraphic

+12

Inutile d'ignorer la propriété ValueTotal. La sérialisation binaire sérialise les champs, pas les propriétés. – Henrik

56

ValueTotal est déjà ignoré. Seules les données sont sérialisées, pas les méthodes. Les propriétés sont des méthodes réellement.

Si vous souhaitez ignorer les champs et ne pas les sérialiser, marquez-les comme [NonSerialized].

'Ou'

vous pouvez mettre en œuvre ISerializable et non sérialiser les champs.

Voici quelques exemples de code sur la façon dont peut mettre en œuvre ISerializable et sérialiser des données: http://www.c-sharpcorner.com/UploadFile/yougerthen/102162008172741PM/1.aspx

+0

S'il s'agit d'un événement tel que 'PropertyChangedEventHandler', il doit être marqué avec _ [field: NonSerialized] _. Je pense que cela sera utile aux personnes qui regardent Votre réponse à la recherche de ce que je cherchais. – Casper

+0

Que recherchiez-vous? ' – ata

+0

Je voulais ignorer la sérialisation d'un événement lors de la sérialisation binaire, et le premier message que j'ai ouvert était celui-ci. J'avais vraiment besoin de la marque _ [field: NonSerialized] _, donc j'ai pensé qu'il serait utile de commenter. – Casper

2

Il y a une autre façon qui ne figure pas ici qui a des avantages (le code ci-dessous a été faite pour soutenir à la fois la sérialisation binaire et xml) (pour votre exemple, vous auriez besoin d'une classe personnalisée pour sérialiser vos interfaces):

[OnSerializing] 
    private void OnSerializing(StreamingContext context) 
    { 
     xmlShape4Port = new xmlStreamShape(shape4Port); 
     shape4Port = null; 
    } 
    [OnDeserialized] 
    private void OnDeserialized(StreamingContext context) 
    { 
     if (xmlShape4Port != null) 
     { 
      shape4Port = xmlShape4Port.getShapeFromSaved(); 
      xmlShape4Port = null; 
     } 
    } 

    [XmlIgnore()] 
    public virtual StreamShape shape4Port {get;set;} 

    [XmlElement("shape4Port")] 
    public xmlStreamShape xmlShape4Port 
    { 
     get 
     { 
      if (shape4Port == null) 
       return null; 
      else 
      { 
       return new xmlStreamShape(shape4Port); 
      } 
     } 
     set 
     { 
      shape4Port = value.getShapeFromSaved(); 
     } 
    } 
Questions connexes