我想序列化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]会导致错误。
答案 0 :(得分: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();
}
有关正常工作的演示,请参阅this fiddle。
答案 1 :(得分:0)
要序列化一个类,您应该添加[Serializable()]属性。