如何在c#中实现对XML的分层序列化?

时间:2016-11-24 15:01:16

标签: c# xml serialization nested

尝试学习并更多地使用类序列化到XML。 我可以做基本的序列化。

在下面的例子中,我有一个嵌套的类结构,并希望将其实现的层次结构中的输出到XML标准的文件中。如果有任何警告,反序列化也是如此。 我有一个很好的搜索,但无法理解如何做到这一点。

我知道下面的一些内容并非100%安全,但我更担心序列化功能。序列化程序类将Serialize()扩展到我的任何类。

非常感谢您的帮助。

    public class SysConfigs
    {
    public SysConfigs() { }

    public struct DeadVolumes
    {
        public struct Valve
        {
            public uint V1;    //valve 1 dead volume in uL
            public uint V2;    //valve 2 deal volume 
            public uint V3;
            public uint V4;
            public uint V5p0;
            public uint V5p1;
            public uint V5p2;
            public uint V5p3;
            public uint V5p4;
            public uint V5p5;
            public uint v5p6;
            public uint V5p7;
            public uint V5p8;
            public uint V5p9;
            public uint V5p10;
            public uint V5p11;
            public uint V5p12;
            public uint V5p13;
            public uint V5p14;
            public uint V6;
        }

        public struct Mixer
        {
            public uint M1p1;
            public uint M1p2;
            public uint M1p3;
            public uint M2p1;
            public uint M2p2;
            public uint M2p3;
        }
    }    
}

    public static class Serializer
    {
    public static void Serialize(this Object obj, string filePath)
    {
        // Creates an instance of the XmlSerializer class;
        // specifies the type of object to be deserialized.
        XmlSerializer _xml_serializer = new XmlSerializer(obj.GetType());
        XmlWriter _xml_textwriter = XmlWriter.Create(filePath);


        try
        {
            _xml_serializer.Serialize(_xml_textwriter, obj);
        }
        catch (Exception ex)
        {
            throw ex;
        }

        _xml_textwriter.Close();

        // If the XML document has been altered with unknown 
        // nodes or attributes, handles them with the 
        // UnknownNode and UnknownAttribute events.
        _xml_serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode);
        _xml_serializer.UnknownAttribute += new XmlAttributeEventHandler(serializer_UnknownAttribute);
    }

    // this is where I am testing the my serialization implementation from
    private void button1_Click(object sender, EventArgs e)
    {
        SysConfigs stuff = new SysConfigs();
        stuff.Serialize("myfile.xml");
    }

上面的示例生成了一个没有内容的XML - 这是可以理解的。

<?xml version="1.0" encoding="utf-8"?><SysConfigs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />

我想了解在上面的例子中需要什么才能实现以下XML程序输出:

<SysConfigs>
  <DeadVolumes>
    <Valve>
      <V1>123</V1>
      <V2>123</V2>
      <V3>123</V3>
     ..etc..
    </Valve>
    <Mixer>
      <M1p1>1</M1p1>
      <M1p2>1</M1p2>
      <M1p3>1</M1p3>
      ..etc..
    </Mixer>
  </DeadVolumes>
</SysConfigs>

1 个答案:

答案 0 :(得分:0)

问题是你的SysConfigs课程没有成员。所以没有什么可序列化的。也没有必要使结构嵌套,或者首先使用结构。所以只需创建一系列类:

public class Valve
{
    public uint V1;
    // ...
    public uint V6;
}

public class Mixer
{
    public uint M1p1;
    // ...
    public uint M1p3;
}

然后创建包含正确成员的容器类:

public class DeadVolume
{
    public Valve Valve { get;set; }
    public Mixer Mixer { get;set; }
}

然后将属性添加到SysConfigs类:

public class SysConfigs
{
    public DeadVolume DeadVolumes { get; set; }
}

现在,您可以实例化并填充SysConfigs实例并对其进行序列化:

var config = new SysConfigs
{
    DeadVolumes = new DeadVolume
    {
        Valve = new Valve
        {
            V1 = 42,
            // ...
        },
        Mixer = new Mixer
        {
            M1p1 = 43,
            // ..
        }
    }
};