从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作为数据属性在我的类?

谢谢你的帮助!

从XMLSerializer中排除某些类型

你正在寻找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>