从XMLSerializer中排除某些类型

时间:2014-08-14 07:57:33

标签: c# xml-serialization xmlserializer

我有一个类需要使用某种指定的类型进行序列化。

[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作为MyClass中的数据属性?

感谢您帮助我!

3 个答案:

答案 0 :(得分:1)

您正在寻找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; }
}

答案 1 :(得分:0)

我认为你正在寻找这个 - http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributes.xmlignore(v=vs.110).aspx

您可以将[XmlIgnoreAttribute] attributte添加到您的Data属性,也可以选择(if(Data is B)..)使用新创建的XmlAttributes删除它。然后使用具有已编辑行为的新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>

答案 2 :(得分:0)

尝试

[XmlIgnore]属性类

命名空间System.Xml.Serialization

使用XmlSerializer类来序列化