尝试学习并更多地使用类序列化到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>
答案 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,
// ..
}
}
};