借鉴cnblog的源码,开始做了一个简单的类及序列化,还比较顺利,后来做了一个包含索引的类,而索引本身又是一个类时遇到了麻烦(集合类)
始终出现错误:不应有 <*** xmlns=''>。//***指集合类名称.
后来试了一下,把开始做的那个不含集合类的XML文件中的元素名称改了,出现相同的错误,所以基本上确认是元素名称错了.
后来网上搜索,看到dudu也曾遇到过这类问题
http://www.cnblogs.com/dudu/archive/2004/03/24/4064.html
是因为集合类从CollectionBase继承,因此生成的元素名称为成员类的名称前加ArrayOf
这样做了,还是出现问题,
没办法,只好用.text自带的SerializationHelper.Save序列化这个集合类到一个XML文件中看看到底是什么,shit,居然是大小写的问题.
我的成员类是用的首字母小写,但集合类序列化后却生成的ArrayOf+首字母大写的成员类名
XML区分大小写我事先知道,但没想到序列化的类会自动转换为首字母大写,哎,都怪自己偷懒,没有按规范写成员类的名称首字母大写.
XML文件
<ArrayOfDepartment>
<Department>
<name>研发中心</name>
</Department>
<Department>
<name>营销中心</name>
</Department>
</ArrayOfDepartment>
[Serializable]
public class Department
{
public Department()
{
}
private string _name;
public string name
{
get
{
return this ._name;
}
set
{
this ._name = value;
}
}
}
[Serializable]
public class DepartmentCollection:CollectionBase
{
public DepartmentCollection()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public Department this [ int index]
{
get { return ((Department)( this .List[index]));}
}
public int Add(Department dp)
{
return List.Add(dp) ;
}
}
public static object Load(Type type, string filename)
{
FileStream fs = null ;
try
{
// open the stream
fs = new FileStream(filename, FileMode.Open,FileAccess.Read);
XmlSerializer serializer = new XmlSerializer(type);
return serializer.Deserialize(fs);
}
catch (Exception e)
{
throw e;
}
finally
{
if (fs != null )
fs.Close();
}
public class Department
{
public Department()
{
}
private string _name;
public string name
{
get
{
return this ._name;
}
set
{
this ._name = value;
}
}
}
[Serializable]
public class DepartmentCollection:CollectionBase
{
public DepartmentCollection()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public Department this [ int index]
{
get { return ((Department)( this .List[index]));}
}
public int Add(Department dp)
{
return List.Add(dp) ;
}
}
public static object Load(Type type, string filename)
{
FileStream fs = null ;
try
{
// open the stream
fs = new FileStream(filename, FileMode.Open,FileAccess.Read);
XmlSerializer serializer = new XmlSerializer(type);
return serializer.Deserialize(fs);
}
catch (Exception e)
{
throw e;
}
finally
{
if (fs != null )
fs.Close();
}