2010-02-25 11 views
30

Tengo un C# POCO regular. En el nivel de clase, estoy decorando el objeto con [Serializable()].Ignorar la serialización binaria en una propiedad

Dicho esto, estoy utilizando el Linq Sum() en una de las propiedades y recibo un error en la serialización. Si es posible, me gustaría simplemente ignorar esta propiedad. Sin embargo, el [XmlIgnore()] es solo para Serialización Xml, no Binario. ¿Alguna idea o pensamiento?

El código es algo como esto, donde me gustaría hacer caso omiso de ValueTotal:

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

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

Tenga en cuenta el punto repetido en las respuestas; En primer lugar, a BinaryFormatter no le importan las propiedades ... –

Respuesta

-11

trucos y utilizar un método

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

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

+1 aunque a veces me cuesta que las propiedades sean iguales al estado, y el estado a veces se calcula, estoy empezando a aceptar más que si estás haciendo cálculos, entonces debería usar un método, ya que muestra la intención de que este valor sea el resultado de un cálculo. La verdad es, ¿por qué serializarías un valor que se calcula, no deberías serializar los datos que deseas, y luego simplemente volver a hacer el cálculo en el otro lado? – NerdFury

+0

Estoy de acuerdo NerdFury, esto comunica mejor mis intenciones. Gracias. -Jessy Houle –

+0

¿Cómo soluciona esto el problema de "recibir un error en la serialización"? Supuse que el Número no era serializable y, por lo tanto, la serialización del campo de respaldo de la propiedad Números fallaría. – Henrik

32

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

Leer de nuevo. Le gusta ignorar ValueTotal-Property, no la lista – Scoregraphic

+12

No es necesario ignorar la propiedad ValueTotal. La serialización binaria serializa los campos, no las propiedades – Henrik

56

ValueTotal ya se ignora. Solo los datos se serializan, no los métodos. Las propiedades son métodos en realidad.

Si desea ignorar los campos y no serializarlos, márquelos como [NonSerialized].

'O'

puede implementar ISerializable y no serializar los campo.

Aquí hay un código de ejemplo de cómo se puede aplicar ISerializable y serializar los datos: http://www.c-sharpcorner.com/UploadFile/yougerthen/102162008172741PM/1.aspx

+0

Si se trata de un evento como 'PropertyChangedEventHandler', debe marcarse con _ [field: NonSerialized] _. Creo que esto será útil para las personas que miran Tu respuesta en busca de lo que estaba buscando. – Casper

+0

¿Qué estabas buscando? ' – ata

+0

Quería omitir la serialización de un evento durante la serialización binaria, y la primera publicación que abrí fue esta. De hecho, necesitaba la marca _ [field: NonSerialized] _, así que pensé que sería útil hacer un comentario. – Casper

2

Hay otra forma que no aparece aquí, que tiene algunas ventajas (el código de abajo se hizo para apoyar tanto la serialización binaria y XML) (por su ejemplo que se necesita una clase personalizada para serializar sus 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(); 
     } 
    } 
Cuestiones relacionadas