DataContractSerializer如何为通用接口列表发出干净的Xml

时间:2013-07-09 08:55:59

标签: c# xml generics serialization datacontractserializer

我有这个对象结构:

[DataContract]
[KnownType(typeof(ChildClassA))]
[KnownType(typeof(ChildClassB))]
public class MainClass
{          
    [DataMember]
    public string PropA { get; set; }       
    [DataMember]
    public IList<IMyInterface> GenericInterfaceList { get; set; }       
    //....
}    
public interface IMyInterface
{
    int Id { get; set; }        
    //....
}    
[DataContract]
public abstract class BaseClass :  IMyInterface
{
    [DataMember]
    public int Id { get; set; }     
    //....
}    
[DataContract]
public class ChildClassA : BaseClass
{
    //....
}    
[DataContract]
public class ChildClassB : BaseClass
{
    //.....
}

我希望DataContractSerializer为我的通用接口列表发出一个没有a:anyType i:type=的Xml:

<MainClass xmlns="MYNAMESPACE" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <PropA> dfgdsfg gsd</PropA>
    <GenericInterfaceList xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <ChildClassA>
            <Id>1</Id>
        </ChildClassA>
        <ChildClassB>
            <Id>2</Id>
        </ChildClassB>
    </GenericInterfaceList>
</MainClass>

而不是:

<MainClass xmlns="MYNAMESPACE" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <PropA> dfgdsfg gsd</PropA>
    <GenericInterfaceList xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <a:anyType i:type="ChildClassA">
            <Id>1</Id>
        </a:anyType>
        <a:anyType i:type="ChildClassB">
            <Id>2</Id>
        </a:anyType>
    </GenericInterfaceList>
</MainClass>

我尝试使用自定义DataContractResolver,但它不是正确的工具。无法找到缩小Xml的方法。

1 个答案:

答案 0 :(得分:0)

我找不到方法,因为没有。

  

DataContractSerializer不允许太多控制:您可以定义   非常清楚(使用这种明确的“选择加入”方法)得到的东西   序列化,但你很少或根本无法控制它是如何得到的   序列