繁体   English   中英

如何使用对象属性序列化CustomClass列表

[英]how to serialize List of CustomClass with object attribute

我想序列化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]会导致错误。

如果要使用属性,则必须显式指定其类型。 尝试此操作时收到错误的原因是,序列化器在反序列化时不知道实际上是什么类型的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();
}  

请参阅此小提琴以获得有效的演示。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM