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();
        }
    }
}

属性 Value のタイプはさまざまであるため、object-type が使用されます。

ここにテストコードがあります

        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 に答える