为什么DataContractSerializer生成一个名称为:"z:anytype"的节点?

本文关键字:quot anytype 节点 DataContractSerializer 一个 为什么 | 更新日期: 2023-09-27 18:02:57

在使用DataContractSerializer时,我得到了许多我不想使用的名称空间的额外属性。我在一个不同的项目中生成了一个类似的数据结构,没有额外的标记,所以我知道这是可能的。

为什么DataContractSerializer生成一个名为:"z:anytype"的节点?

为什么DataContractSerializer生成一个名称为:"z:anytype"的节点?

我的问题是我将一个接口作为类型传递给我的DataContractSerializer。

很容易被忽略,因为我的接口被命名为IInvestment。

如果遇到这个问题,请检查传递给DataContractSerializer构造函数的类型。

如果您正在序列化object的某些集合(数组、列表、字典等),那么您就需要这样做- anyType实际上意味着任何类型都可以在那里(尽管您有一个属性指定值的实际类型)。在下面的例子中,它显示了。

public class StackOverflow_6780831
{
    [DataContract(Name = "Order")]
    public class Order
    {
        [DataMember(Order = 1)]
        public int Id;
        [DataMember(Order = 2)]
        public List<object> List;
    }
    public static void Test()
    {
        MemoryStream ms = new MemoryStream();
        Order order = new Order
        {
            Id = 1,
            List = new List<object>
            {
                1, "some string", DateTime.Now
            },
        };
        DataContractSerializer dcs = new DataContractSerializer(typeof(Order));
        XmlWriter w = XmlWriter.Create(ms, new XmlWriterSettings
        {
            Indent = true,
            IndentChars = "  ",
            OmitXmlDeclaration = true
        });
        dcs.WriteObject(w, order);
        w.Flush();
        Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
    }
}