Ответ 1
Обмануть и использовать метод
[Serializable()]
public class Foo
{
public IList<Number> Nums { get; set; }
public long GetValueTotal()
{
return Nums.Sum(x => x.value);
}
}
У меня есть обычный С# POCO. На уровне класса я украшаю объект [Serializable()]
.
Тем не менее, я использую Linq Sum()
для одного из свойств, и я получаю сообщение об ошибке при сериализации. Если возможно, я просто просто проигнорирую это свойство. Однако [XmlIgnore()]
предназначен только для Xml Serialization, а не для двоичного. Любые идеи или мысли?
Код - это что-то вроде этого, где я хотел бы игнорировать ValueTotal
:
[Serializable()]
public class Foo
{
public IList<Number> Nums { get; set; }
public long ValueTotal
{
get { return Nums.Sum(x => x.value); }
}
}
Обмануть и использовать метод
[Serializable()]
public class Foo
{
public IList<Number> Nums { get; set; }
public long GetValueTotal()
{
return Nums.Sum(x => x.value);
}
}
ValueTotal
уже игнорируется. Только данные сериализуются, а не методы. Свойства - это методы на самом деле.
Если вы хотите игнорировать поля, а не сериализовывать их, отметьте их как [NonSerialized]
.
'Или'
вы можете реализовать ISerializable
и не сериализовать это поле.
Вот пример кода, который может реализовать ISerializable
и сериализовать данные: http://www.c-sharpcorner.com/UploadFile/yougerthen/102162008172741PM/1.aspx
[NonSerialized]
private IList<Number> nums;
public IList<Number> Nums { get {return nums;} set { nums = value; } }
Существует другой способ, который не указан здесь, который имеет некоторые преимущества (приведенный ниже код был предназначен для поддержки как двоичной сериализации, так и 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();
}
}
Внедрите ISerializable
интерфейс, а затем используйте [XmlIgnore]
для сериализации XML в GetObjectData() но затем выводится как двоичный. Это на самом деле проще, чем то, как я только что описал его.
Для идей см. http://www.c-sharpcorner.com/UploadFile/yougerthen/102162008172741PM/1.aspx