0

我想序列化 CMainClass:

[XmlType("Param")]
public class CParam
{
    [XmlElement]
    public string Name;
    [XmlElement]
    public object Value;

    public CParam() { }
    public CParam(string name, object value)
    {
        Name = name;
        Value = value;
    }
}

public class CMainClass
{
    public List<CParam> Parameters = new List<CParam>();
    public CMainClass() { }
    public string GetXML()
    {
        XmlDocument doc = new XmlDocument();
        Type[] extraTypes = new Type[1];
        extraTypes[0] = typeof(CParam);
        XmlSerializer serializer = new XmlSerializer(typeof(CMainClass), extraTypes); 
        MemoryStream stream = new MemoryStream();
        try
        {
            serializer.Serialize(stream, this);
            stream.Position = 0;
            doc.Load(stream);
            return doc.InnerXml;
        }
        catch { throw; }
        finally
        {
            stream.Close();
            stream.Dispose();
        }
    }
}

属性值的类型可以多种多样,这就是使用对象类型的原因。

这是测试代码

        CMainClass mc = new CMainClass();
        mc.Parameters.Add(new CParam("number", 123));
        mc.Parameters.Add(new CParam("text", "lorem ipsum"));
        mc.Parameters.Add(new CParam("price", 23.50));

        string s = mc.GetXML();
        Console.WriteLine(s);
        Console.ReadLine();

我想要的只是得到以下形式的输出

<?xml version="1.0"?>
<CMainClass>
    <Parameters>
        <Param Name="number" Value="123" />
        <Param Name="text" Value="lorem ipsum" />
        <Param Name="price" Value="23.5" />
    </Parameters>
</CMainClass>

代替

<?xml version="1.0"?>
<CMainClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Parameters>
        <Param>
            <Name>number</Name>
            <Value xsi:type="xsd:int">123</Value>
        </Param>
        <Param>
            <Name>text</Name>
            <Value xsi:type="xsd:string">lorem ipsum</Value>
        </Param>
        <Param>
            <Name>price</Name>
            <Value xsi:type="xsd:double">23.5</Value>
        </Param>
    </Parameters>
</CMainClass>

可能吗?将 Value 的属性从 [XmlElement] 更改为 [XmlAttribute] 会导致错误。

4

2 回答 2

0

如果要使用属性,则必须明确指定它们的类型。尝试此操作时出现错误的原因是序列化程序在反序列化时不知道object实际是什么类型,因为与元素不同,它不能使用类型属性来指示这一点。您将不得不将其更改为string并自己处理转换。

public class Param
{     
    [XmlAttribute]
    public string Name { get; set; }
    [XmlAttribute]
    public string Value { get; set; }
}

另请注意,您的GetXML方法可以简化为:

var serializer = new XmlSerializer(typeof(CMainClass));

using (var writer = new StringWriter())
{
    serializer.Serialize(writer, this);
    return writer.ToString();
}  

请参阅此小提琴以获取工作演示。

于 2016-08-24T10:48:58.623 回答
0

要序列化一个类,您应该添加 [Serializable()] 属性。

于 2016-08-24T11:50:12.937 回答