忽略属性上的二进制序列化

时间:2010-02-25 15:22:21

标签: c# serialization

我有一个普通的C#POCO。在班级,我用[Serializable()]装饰对象。

那就是说,我在其中一个属性上使用Linq Sum(),我在序列化时收到错误。如果可能的话,我想简单地忽略这个属性。但是,[XmlIgnore()]仅适用于Xml序列化,而不适用于二进制。任何想法或想法?

代码是这样的,我想忽略ValueTotal

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

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

5 个答案:

答案 0 :(得分:59)

ValueTotal已被忽略。只序列化数据,而不是方法。属性实际上是方法。

如果您希望忽略字段而不是序列化字段,请将其标记为[NonSerialized]

'或'

您可以实施ISerializable而不是序列化这些字段。

以下是有关如何实施ISerializable和序列化数据的示例代码:http://www.c-sharpcorner.com/UploadFile/yougerthen/102162008172741PM/1.aspx

答案 1 :(得分:33)


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

答案 2 :(得分:3)

此处未列出的另一种方法有一些好处(下面的代码用于支持二进制序列化和xml)(对于您的示例,您需要一个自定义类来序列化接口):

    [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();
        }
    }

答案 3 :(得分:0)

实现ISerializable接口,然后在 GetObjectData()方法中使用 [XmlIgnore] 进行XML序列化,然后输出为二进制。它实际上比我刚才描述的更简单。

有关提示,请参阅http://www.c-sharpcorner.com/UploadFile/yougerthen/102162008172741PM/1.aspx

答案 4 :(得分:-11)

作弊并使用方法

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

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