我有一个普通的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); }
}
}
答案 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);
}
}