2010-02-25 13 views
30

Mam regularne C# POCO. Na poziomie klasy dekoruję obiekt za pomocą [Serializable()].Zignoruj ​​serializację binarną na obiekcie

Powiedział, że używam Linq Sum() na jednej z właściwości i otrzymuję błąd podczas serializacji. Jeśli to możliwe, chciałbym po prostu zignorować tę właściwość. Jednak [XmlIgnore()] służy tylko do serializacji Xml, a nie do plików binarnych. Wszelkie pomysły lub przemyślenia?

Kod jest coś takiego, gdzie chciałbym zignorować ValueTotal:

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

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

Zanotuj powtarzający się punkt w odpowiedziach; BinaryFormatter nie przejmuje się właściwościami w pierwszej kolejności ... –

Odpowiedz

-11

Cheat i stosować metodę

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

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

+1, podczas gdy ja czasami mam problemy z właściwościami, które są równe stanowi, a stan jest czasem obliczany, zaczynam się zgadzać, że jeśli robisz obliczenia, to powinien użyć metody, ponieważ pokazuje zamiar, że ta wartość jest wynikiem obliczeń. Prawda jest taka, dlaczego miałbyś serializować wartość, która jest obliczana, czy nie należy serializować danych, które chcesz, a następnie po prostu przerobić obliczenia po drugiej stronie? – NerdFury

+0

Zgadzam się z NerdFury, to lepiej przekazuje moje intencje. Dziękuję Ci. -Jessy Houle –

+0

W jaki sposób rozwiązuje to problem "otrzymując błąd podczas serializacji"? Założono, że numer nie był możliwy do serializacji, a więc serializowanie pola kopii właściwości Nums zakończyłoby się niepowodzeniem. – Henrik

32

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

Przeczytaj ponownie. Lubi ignorować wartość ValueTotal-Property, a nie listę – Scoregraphic

+12

Nie trzeba ignorować właściwości ValueTotal. Serializacja binarna serializuje pola, a nie właściwości – Henrik

56

ValueTotal jest już ignorowany. Tylko dane są serializowane, a nie metody. Właściwości to właściwie metody.

Jeśli chcesz zignorować pola i nie serializować ich, oznacz je jako [NonSerialized].

'lub'

można zaimplementować ISerializable i nie szeregować te pole.

Oto przykładowy kod, w jaki sposób można wdrożyć ISerializable i szeregować dane: http://www.c-sharpcorner.com/UploadFile/yougerthen/102162008172741PM/1.aspx

+0

Jeśli jest to zdarzenie typu 'PropertyChangedEventHandler', powinno być oznaczone _ [pole: NieSerialized] _. Myślę, że przyda się to osobom, które patrzą na Twoją odpowiedź w poszukiwaniu tego, czego szukałem. – Casper

+0

czego szukałeś? ' – ata

+0

Chciałem pominąć serializację zdarzenia podczas serializacji binarnej, a pierwszym wpisem, który otworzyłem, był ten. Potrzebowałem znaku _ [field: NonSerialized] _, więc pomyślałem, że warto by to skomentować. – Casper

2

Jest też inny sposób, że nie ma na liście, która ma pewne zalety (kod poniżej powstał w celu wspierania zarówno binarnej serializacji XML) (dla przykładu będzie trzeba niestandardowej klasy w celu serializacji interfejsów):

[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(); 
     } 
    } 
Powiązane problemy