序列化从通用集合派生的类,然后反序列化通用集合

时间:2010-03-14 04:19:42

标签: c# xml-serialization

我有一个包含以下方法的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();
        }
    }

1 个答案:

答案 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));
        }
    }
}