实现IXmlSerializable

实现IXmlSerializable

我想通过实现IXmlSerializable创建自定义xml序列化。
我已经有了实现IXmlSerializable接口的测试类:

[Serializable]
public class Employee : IXmlSerializable
{
    public Employee()
    {
        Name = "Vyacheslav";

        Age = 23;
    }

    public string Name{get; set;}

    public int Age { get; set; }



    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        this.Name = reader["Name"].ToString();
        this.Age = Int32.Parse(reader["Age"].ToString());
    }

    public void WriteXml(XmlWriter writer)
    {
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.OmitXmlDeclaration = true;
        settings.ConformanceLevel = ConformanceLevel.Fragment;

        XmlWriter newWriter = XmlWriter.Create(writer, settings);
        newWriter.WriteAttributeString("Name", this.Name);
        newWriter.WriteAttributeString("Age", this.Age.ToString());
    }
}


我想做的是省略xml声明。为此,我创建了XmlWriterSettings的适当实例,并将其作为第二个参数传递来创建新的XmlWriter。
但是,当我调试这段代码时,我看到newWriter.Settings.OmitXmlDeclaration设置为false,并且序列化的数据包含标记。我究竟做错了什么?

实际的序列化如下所示:

        var me = new Employee();

        XmlSerializer serializer = new XmlSerializer(typeof(Employee));
        TextWriter writer = new StreamWriter(@"D:\file.txt");
        serializer.Serialize(writer, me);
        writer.Close();


第二个问题是-如果我想序列化要在字段上具有通用类型ContactInfo的类型Employee,我是否也需要在ContactInfo上实现IXmlSerializable?

最佳答案

作者设置是最外面的作者的功能;您应该将其应用于创建文件的代码,即

using(var file = File.Create("file.txt"))
using(var writer = XmlWriter.Create(file, settings))
{
    serializer.Serialize(writer, me);
}


另外,那么,您无需实现IXmlSerializable。您不能在内部执行此操作-为时已晚。

例如:

using System.IO;
using System.Xml;
using System.Xml.Serialization;
public class Employee
{
    [XmlAttribute] public string Name { get; set; }
    [XmlAttribute] public int Age { get; set; }
}
class Program
{
    static void Main()
    {
        var settings = new XmlWriterSettings();
        settings.OmitXmlDeclaration = true;
        var me = new Employee {
            Name = "Vyacheslav", Age = 23
        };
        var serializer = new XmlSerializer(typeof (Employee));
        using (var file = File.Create("file.txt"))
        using (var writer = XmlWriter.Create(file, settings))
        {
            serializer.Serialize(writer, me);
        }
    }
}


如果您不想要多余的名称空间,则:

        var ns = new XmlSerializerNamespaces();
        ns.Add("", "");
        serializer.Serialize(writer, me, ns);


生成文件:

<Employee Name="Vyacheslav" Age="23" />

08-05 06:10