Esa*_*aty 19 .net c# ienumerable list xml-serialization
我在这里有一个情况,我需要继承自己的类List<ItemType>
,但是当我这样做时,XmlSerializer不会序列化我的类中声明的任何属性或字段,以下示例演示:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DoSerialize();
}
private void DoSerialize()
{
MyClass obj = new MyClass();
obj.Add(1);
obj.Add(2);
obj.Add(3);
XmlSerializer s = new XmlSerializer(typeof(MyClass));
StringWriter sw = new StringWriter();
s.Serialize(sw, obj);
}
}
[Serializable]
[XmlRoot]
public class MyClass : List<int>
{
public MyClass()
{
}
int myAttribute = 2011;
[XmlAttribute]
public int MyAttribute
{
get
{
return myAttribute;
}
set
{
myAttribute = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果XML:
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfInt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<int>1</int>
<int>2</int>
<int>3</int>
</ArrayOfInt>
Run Code Online (Sandbox Code Playgroud)
dri*_*iis 24
这是设计的.我不知道为什么做出这个决定,但是在文件中说明了这一点:
- 实现ICollection或IEnumerable的类.只有集合是序列化的,而不是公共属性.
(查看"可以序列化的项目"部分).有人提出了一个针对此的错误,但它不会被更改 - 在这里,微软也确认不包括实现类的属性ICollection
实际上是XmlSerializer的行为.
解决方法是:
IXmlSerializable
自己实现和控制序列化.要么
要么
小智 5
这里有一个虽然供您考虑。
你可以有一个像这样的容器类:
class ContainerObject
{
public int MyNewProperty { get; set; }
[XmlElement("")]
public List<int> MyList { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
诀窍是在 List 元素上方设置 XmlElement name = ""。
当它被序列化为 xml 时,您将拥有:
<ContainerObject>
<MyNewProperty>...</MyNewProperty>
<int>...</int>
<int>...</int>
</ContainerObject>
Run Code Online (Sandbox Code Playgroud)
如果您愿意,还可以为列表中的项目创建另一个类
class MyItem
{
public int MyProperty {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
然后不是有整数列表,而是有一个 MyItem 列表。
这是您控制列表中每个项目的 XmlElement 名称。
我希望这可以帮到你。
归档时间: |
|
查看次数: |
5758 次 |
最近记录: |