我有一个类,其对象必须根据bool值序列化/反序列化属性。
[System.SerializableAttribute()]
public class Foo
{
private string myField;
private bool myFieldSerializes;
//Parameterless construction for serializing purposes
public Foo() { }
public Foo(string myField, bool myFieldSerializes)
{
this.myField = myField;
this.myFieldSerializes = myFieldSerializes;
}
public string MyField
{
get {return this.myField;}
set {this.myField = value;}
}
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool MyFieldSerializes
{
get {return this.myFieldSerialzes;}
set {this.myFieldSerialzes = value;}
}
}这就是它的工作方式:
实现此行为的方法是什么?
谢谢!:)
发布于 2015-12-16 21:52:01
您的需求与propertyNameSpecified模式的XmlSerializer相匹配。来自文档
如果架构包括一个可选元素.一种选择是使用一种特殊的模式来创建一个由XmlSerializer识别的布尔字段,并将XmlIgnoreAttribute应用于该字段。模式是以propertyNameSpecified的形式创建的。例如,如果有一个名为"MyFirstName“的字段,您还将创建一个名为"MyFirstNameSpecified”的字段,该字段指示XmlSerializer是否生成名为"MyFirstName“的XML元素。
这种模式的方便之处在于,在反序列化过程中,除了文档记录的行为之外,如果遇到属性,XmlSerializer将将propertyNameSpecified设置为true --这正是您所需要的。因此,您的类应该如下所示:
public class Foo
{
private string myField;
private bool myFieldSerializes;
//Parameterless construction for serializing purposes
public Foo() { }
public Foo(string myField, bool myFieldSerializes)
{
this.myField = myField;
this.myFieldSerializes = myFieldSerializes;
}
[XmlElement(IsNullable = true)] // Emit a value even when null as long as MyFieldSpecified == true
public string MyField
{
get { return this.myField; }
set { this.myField = value; }
}
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool MyFieldSpecified { get { return myFieldSerializes; } set { myFieldSerializes = value; } }
}(将[XmlElement(IsNullable = true)]添加到MyField属性可以确保元素始终在MyFieldSpecified == true时发出,即使字段本身是null。)
原型小提琴。
发布于 2015-12-16 21:32:47
似乎您可以使用ShouldSerialize方法:
https://msdn.microsoft.com/en-us/library/53b8022e(v=vs.110).aspx
public bool ShouldSerializeMyField()
{
return this.myFieldSerializes;
}发布于 2015-12-16 21:42:52
您可以实现ISerializable接口,它允许您指定要序列化和反序列化的内容。
因此,您需要实现如下所示的GetObjectData方法:
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
// Use the AddValue method to specify serialized values.
info.AddValue("props", myProperty_value, typeof(string));
}和一个构造函数,它将SerializationInfo和StreamingContext作为参数,如
// The special constructor is used to deserialize values.
public Foo(SerializationInfo info, StreamingContext context)
{
// Reset the property value using the GetValue method.
myProperty_value = (string) info.GetValue("props", typeof(string));
}通过这种方式,您可以在序列化和反序列化期间决定该做什么(例如,设置属性的值,.)
https://stackoverflow.com/questions/34322386
复制相似问题