我有一个包含以下方法的Repository类...
public T Single<T>(Predicate<T> expression)
{
using (var list = (Models.Collectable<T>)System.Xml.Serializer.Deserialize(typeof(Models.Collectable<T>), FileName))
{
return list.Find(expression);
}
}
定义了Collectable ..
[Serializable]
public class Collectable<T> : List<T>, IDisposable
{
public Collectable() { }
public void Dispose() { }
}
定义使用它的项目..
[Serializable]
[System.Xml.Serialization.XmlRoot("Titles")]
public partial class Titles : Collectable<Title>
{
}
问题是当我调用该方法时,它希望“Collectable”是XmlRoot,但XmlRoot是“标题”(所有对象标题)。
我有几个类在这样的.xml文件中收集的类,但是当通用访问器执行时重写加载每个类的基本方法似乎没有意义 - 但是如何为每个文件强制执行正确的根名称每个硬编码方法? [System.Xml.Serialization.XmlRoot]似乎被忽略了。
当这样调用时......
var titles = Repository.List<Models.Title>();
我得到了例外
<Titlesxmlns=''> was not expected.
XML的格式如。 ..
<?xml version="1.0" encoding="utf-16"?>
<Titles xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Title>
<Id>442daf7d-193c-4da8-be0b-417cec9dc1c5</Id>
</Title>
</Titles>
这是反序列化代码。
public static T Deserialize<T>(String xmlString)
{
System.Xml.Serialization.XmlSerializer XmlFormatSerializer
= new System.Xml.Serialization.XmlSerializer(typeof(T));
StreamReader XmlStringReader = new StreamReader(xmlString);
//XmlTextReader XmlFormatReader = new XmlTextReader(XmlStringReader);
try
{
return (T)XmlFormatSerializer.Deserialize(XmlStringReader);
}
catch (Exception e)
{
throw e;
}
finally
{
XmlStringReader.Close();
}
}
答案 0 :(得分:1)
集合的文档根目录没有任何意义。它可能包含一个集合,但它不能 一个。
您的问题似乎更简单。您无法使用开放泛型类型(Models.Collectable<T>
)创建序列化程序。请尝试使用typeof(Titles)
。
我对你的存储库类做了一些假设,但这样的工作会不会有用呢?
public class Repository<T>
{
protected static TextReader FileName { get; set; }
public static TCollection List<TCollection>()
{
var ser = new XmlSerializer(typeof (TCollection));
return (TCollection) ser.Deserialize(FileName);
}
public static TItem Single<TItem, TCollection>(Predicate<TItem> expression)
where TCollection : IDisposable, IEnumerable<TItem>
{
using (var list = List<TCollection>())
{
return list.Single(item => expression(item));
}
}
}