从XMLSerializer中排除某些类型
本文关键字:类型 排除 XMLSerializer | 更新日期: 2023-09-27 18:18:01
我有一个类,它有一个属性需要被序列化成某种指定的类型。
[Serializable]
public class MyClass
{
private object _data;
//[Any magic attribute here to exclude some types while serialization?]
public object Data
{
get { return _data;}
set { _data = value; }
}
}
[Serializable]
public class A
{}
[Serializable]
public class B
{}
MyClass myClass = new MyClass();
在某些情况下,我有:
myClass.Data = A;
在某些情况下,我有:
myClass.Data = B;
然后我对MyClass进行序列化。我的问题是:我如何序列化类B,但类A作为数据属性在我的类?
谢谢你的帮助!
你正在寻找ShouldSerialize模式:
[XmlRoot(ElementName="Foo")]
public class Foo
{
[XmlElement(ElementName="Bar")]
public int Bar { get; set; }
public bool ShouldSerializeBar()
{
return (Bar > 10);
}
}
如果属性'Bar'大于10,则会被序列化,否则不会。
创建一个布尔方法,在属性名前面加上'ShouldSerialize'。如果布尔值返回false,则不会序列化该属性。
更具体到你的情况:
[XmlInclude(typeof(Foo))]
[XmlInclude(typeof(Bar))]
[XmlRoot(ElementName = "Foo")]
public class FooBar
{
[XmlElement(ElementName = "Data")]
public object Data { get; set; }
public bool ShouldSerializeData()
{
return (Data.GetType() == typeof(Foo));
}
}
[XmlRoot(ElementName="Foo")]
public class Foo
{
[XmlElement(ElementName="Bar")]
public int Bar { get; set; }
}
[XmlRoot(ElementName = "Bar")]
public class Bar
{
[XmlElement(ElementName = "Foo")]
public int Foo { get; set; }
}
Try
[XmlIgnore]属性类
名称空间System.Xml.Serialization使用XmlSerializer类序列化
我想你正在寻找这个- http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributes.xmlignore(v=vs.110).aspx
你可以添加[XmlIgnoreAttribute]属性到你的数据属性,并可选地(如果(数据是B) ..)删除它与新创建的xmlatattributes。然后使用带有编辑行为的新XmlSerializer。
编辑:例子:
public class A
{
public string Text { get; set; }
}
public class B : A { }
public class C : A { }
[XmlInclude(typeof(B))]
[XmlInclude(typeof(C))]
public class D
{
public object Data { get; set; }
public string Test = "Test";
}
class Program
{
static void Main(string[] args)
{
var d = new D();
d.Data = new B() { Text = "Data" };
var xSer = CreateOverrider(d);
xSer.Serialize(new StreamWriter(File.OpenWrite("D:''testB.xml")), d);
}
public static XmlSerializer CreateOverrider(D d)
{
XmlAttributeOverrides xOver = new XmlAttributeOverrides();
XmlAttributes attrs = new XmlAttributes();
attrs.XmlIgnore = d.Data is B;
xOver.Add(typeof(D), "Data", attrs);
XmlSerializer xSer = new XmlSerializer(typeof(D), xOver);
return xSer;
}
}
对于B,你得到:
<?xml version="1.0" encoding="utf-8"?>
<D xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Test>Test</Test>
</D>
C: <?xml version="1.0" encoding="utf-8"?>
<D xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Test>Test</Test>
<Data xsi:type="C">
<Text>Data</Text>
</Data>
</D>