我尝试使用XML序列化设置一个非常小的数据库,更具体地说是XmlSerializer。
我的主要课程如下:
public class XmlDB
{
[XmlIgnore]
public string FilePath { get; private set; }
public List<FooType> Foos { get; set; }
public List<BarType> Bars { get; set; }
public List<ThirdType> Thirds { get; set; }
private XmlDB():this(null) { }
public XmlDB(string strDBPath) {
this.FilePath = strDBPath;
this.Foos = new List<FooType>();
this.Bars = new List<BarType>();
this.Thirds = new List<ThirdType>();
}
public static XmlDB Load(string strDBPath) {
using (XmlReader reader = XmlReader.Create(strDBPath)) {
XmlDB db = (XmlDB)new XmlSerializer(typeof(XmlDB)).Deserialize(reader);
db.FilePath = strDBPath;
return db;
}
}
public void SaveChanges() {
XmlWriterSettings settings = new XmlWriterSettings() {
Indent = true,
Encoding = Encoding.UTF8
};
using (XmlWriter writer = XmlWriter.Create(this.FilePath, settings)) {
XmlSerializer ser = new XmlSerializer(typeof(XmlDB));
ser.Serialize(writer, this);
}
}
}
我的测试方法创建一个实例,填充列表并调用SaveChanges方法。 在序列化时一切正常,Xml输出看起来一致。
反序列化时出现问题:没有报告错误但只处理了第一个List的第一个项目,第一个列表的以下项目没有反序列化,以下列表也没有...
如果我对Xml中列表的顺序进行随机排序,它始终是Xml文件中反序列化的第一个列表的第一项。
我尝试了以下简单的测试来确认(遗憾的是,所有列表都在反序列化时填充):
public class DBTestList
{
public List<DBTest> TestList { get; set; }
public List<DBTest2> TestList2 { get; set; }
public DBTestList() {
this.TestList = new List<DBTest>();
this.TestList2 = new List<DBTest2>();
}
}
public class DBTest
{
public int TestInt { get; set; }
public string TestStr { get; set; }
}
public class DBTest2
{
public int TestInt { get; set; }
public string TestStr { get; set; }
}
public void TestSerialProblem() {
//Init data
DBTestList tl = new DBTestList();
tl.TestList.Add(new DBTest() { TestInt = 1, TestStr = "test11" });
tl.TestList.Add(new DBTest() { TestInt = 2, TestStr = "test12" });
tl.TestList2.Add(new DBTest2() { TestInt = 3, TestStr = "test21" });
XmlWriterSettings settings = new XmlWriterSettings() {
Indent = true,
Encoding = Encoding.UTF8
};
using (XmlWriter writer = XmlWriter.Create("test.db", settings)) {
XmlSerializer ser = new XmlSerializer(typeof(DBTestList));
ser.Serialize(writer, tl);
}
using (XmlReader reader = XmlReader.Create("test.db")) {
DBTestList db = (DBTestList)new XmlSerializer(typeof(DBTestList)).Deserialize(reader);
Assert.IsTrue(db.TestList2[0].TestStr == "test21");
}
}
我在这个主题上阅读了很多帖子但没有帮助。 你有什么想法吗?
谢谢, 最好的问候。
编辑: 为了更详细地了解列表中使用的类,这是一个基本实现。 所有类型都是从父类a_SolidElement派生的,只添加了几个属性(基本值类型和/或枚举):
public abstract class a_SolidElement
{
[XmlIgnore]
public int Position { get; set; }
public virtual double Thickness { get; set; }
public virtual double Density { get; set; }
public string SupplierName { get; set; }
public string Name { get; set; }
}
public enum ElementType
{
Undefined=0,
TypeA,
TypeB
}
public class FooType:a_SolidElement
{
public double AdditionalData { get; set; }
public e_ElementType ElementType { get; set; }
}
答案 0 :(得分:0)
在他的评论中,dbc实际上对于错误的IXmlSerializable实现是正确的: 在我的一个课程中,我有一个我没有写过的类型的属性,在readXml方法中存在问题。
我一开始并没有看到它,因为我先后删除了一些属性,看看哪一个导致了问题,但是这个仍然在第一个反序列化的项目中,所以即使后续的没有它也没有,读者仍然被第一个搞砸了。
现在很明显,我首先要问这个问题感觉很糟糕!
非常感谢您的帮助!