2016-08-24 104 views
0

我想序列CMainClass:如何序列CustomClass的列表与对象属性

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

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> 

是否有可能得到的输出?将值的属性从[XmlElement]更改为[XmlAttribute]会导致错误。

+0

你知道使用该构造函数的内存泄漏吗? http://blog.forse.no/xmlserializer-causes-memory-leaks/ – Aphelion

回答

0

如果你想使用属性,那么你必须明确指定它们的类型。在尝试这样做时出现错误的原因是序列化程序不知道反序列化时实际上是什么类型,因为与元素不同,它不能使用类型属性来指示这一点。您将不得不将其更改为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(); 
} 

this fiddle了工作演示。

0

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

+0

这两个都没有回答这个问题,事实上是不正确的 - “Serializable'与'XmlSerializer'无关。 –

相关问题