C# 忽略属性上的二进制序列化
我有一个普通的C#POCO。在类级别,我用C# 忽略属性上的二进制序列化,c#,serialization,C#,Serialization,我有一个普通的C#POCO。在类级别,我用[Serializable()]装饰对象 也就是说,我在其中一个属性上使用LinqSum(),在序列化时收到一个错误。如果可能的话,我只想忽略这个属性。但是,[XmlIgnore()]仅用于Xml序列化,而不是二进制。有什么想法吗 代码是这样的,我想忽略ValueTotal: [Serializable()] public class Foo { public IList<Number> Nums { get; set; } pub
[Serializable()]
装饰对象
也就是说,我在其中一个属性上使用LinqSum()
,在序列化时收到一个错误。如果可能的话,我只想忽略这个属性。但是,[XmlIgnore()]
仅用于Xml序列化,而不是二进制。有什么想法吗
代码是这样的,我想忽略ValueTotal
:
[Serializable()]
public class Foo
{
public IList<Number> Nums { get; set; }
public long ValueTotal
{
get { return Nums.Sum(x => x.value); }
}
}
[Serializable()]
公开课Foo
{
公共IList Nums{get;set;}
公共长期资产总额
{
获取{返回Nums.Sum(x=>x.value);}
}
}
欺骗并使用方法
[Serializable()]
public class Foo
{
public IList<Number> Nums { get; set; }
public long GetValueTotal()
{
return Nums.Sum(x => x.value);
}
}
[Serializable()]
公开课Foo
{
公共IList Nums{get;set;}
公共长期价值总计()
{
返回Nums.Sum(x=>x.value);
}
}
[非串行化]
私营机构;
公共IList Nums{get{return Nums;}set{Nums=value;}}
ValueTotal
已被忽略。只序列化数据,不序列化方法。属性实际上是方法
如果希望忽略字段而不序列化字段,请将其标记为[非序列化]
“或者”
您可以实现ISerializable
,而不序列化这些字段
下面是一些关于如何实现ISerializable
和序列化数据的示例代码:实现接口,然后在GetObjectData()方法中使用[XmlIgnore]
进行XML序列化,然后作为二进制输出。这比我刚才描述的要简单
有关想法,请参见这里没有列出的另一种方法有一些好处(下面的代码是用来支持二进制序列化和xml的)(例如,您需要一个自定义类来序列化接口):
再读一遍。他喜欢忽略ValueTotal属性,而不是列表无需忽略ValueTotal属性。二进制序列化序列化字段,而不是属性+1。虽然我有时会纠结于属性是否等于状态,而状态有时是经过计算的,但我开始更加同意,如果您正在进行计算,那么您应该使用一个方法,因为它表明此值是计算的结果。事实是,你为什么要序列化一个计算出的值,你不应该序列化你想要的数据,然后在另一边重做计算吗?我同意NerdFury,这确实更好地传达了我的意图。多谢各位-Jessy Houle这是如何解决“序列化时接收错误”的问题的?我假设数字是不可序列化的,因此序列化Nums属性的支持字段将失败
BinaryFormatter
不查看方法或属性-它只查看字段。将属性更改为字段不应以任何方式影响BinaryFormatter在此处的工作方式。@NerdFury有时您希望某些类型的计算数据可在数据绑定中显示。在这种情况下,一种方法是不好的。注意回复中重复的要点;BinaryFormatter一开始并不关心属性……如果它是类似于PropertyChangedEventHandler
的事件,则应该用[field:NonSerialized]标记它。我想这对那些在搜索我正在搜索的内容时查看你的答案的人来说很有用。你在搜索什么?`我想在二进制序列化期间跳过事件的序列化,我打开的第一篇文章就是这篇。实际上,我需要[field:NonSerialized]标记,所以我认为进行注释会很有用。
[NonSerialized]
private IList<Number> nums;
public IList<Number> Nums { get {return nums;} set { nums = value; } }
[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();
}
}