集合存储库实现,具有处理序列化的能力

时间:2011-06-11 17:35:58

标签: c# serialization xml-serialization datacontractserializer

我有几个看起来相同的集合,但对不同类型的集合项进行操作,如下所示:

[CollectionDataContract(ItemName = "Culture")]
public sealed class Cultures : List<LangCult>
{
}

这里的重要代码是CollectionDataContract属性,它允许我们将此集合序列化为带有DataContractSerializer的XML文件。整个集合被序列化为一个XML文件,名为集合类的名称,例如Cultures.xml

我想提出一个存储库,它正好有一个存储库接口,可以处理所有可能的集合,例如public class Slugs : List<string>

我尝试过这样的事情,但我不知道这是否是最好的选择:

public interface ICollectionsRepository<T> where T : IEnumerable

你的想法?

请不要回复有关如何序列化的说明,因为这不是问题所在,而是让它有效。

1 个答案:

答案 0 :(得分:0)

也许我应该说我想要一个带有通用项目的泛型集合的接口,其中项目有一个共同的基类。这就是我解决它的方式,希望有一天有人觉得它很有用。

/// <summary>
/// This repo enables us to work with serialisable collections. Collection class has
/// to inherit from IEnumerable and must be described with CollectionDataContract attribute
/// </summary>
/// <typeparam name="T"></typeparam>
public interface ICollectionsRepository<T, V> where T : Collection<V>
{
    /// <summary>
    ///     Get collection from datastore
    /// </summary>
    /// <returns>List of items</returns>
    T Load();

    /// <summary>
    ///     Add new collection item to datastore
    /// </summary>
    /// <param name="item">Item to be added to the collection</param>
    void Add(V item);
}

public class XmlCollectionsProvider<T, V> : ICollectionsRepository<T, V> where T: Collection<V>, new() where V: CollectionItem
{
    private readonly string _file = Path.Combine(XmlProvider.DataStorePhysicalPath, typeof(T).Name + ".xml");

    public T Load()
    {
        if (!DefaultsExist()) {
            CreateDefaults();
        }

        DataContractSerializer dcs = new DataContractSerializer(typeof(T));
        T obj = null;
        XmlDictionaryReader reader =
            XmlDictionaryReader.CreateTextReader(new FileStream(_file, FileMode.Open, FileAccess.Read),
                                                                                     new XmlDictionaryReaderQuotas());

        obj = (T)dcs.ReadObject(reader, true);
        reader.Close();
        return obj;
    }

    public void Add(V item)
    {
        T collection = Load();
        collection.Add(item);
        Save(collection);
    }
}

[CollectionDataContract(ItemName = "Culture")]
public sealed class Cultures : List<LangCult>   {   }

[DataContract]
public class LangCult : CollectionItem
{
    ...
}

[DataContract]
public abstract class CollectionItem
{
    [DataMember]
    public string Id
    {
        get;
        set;
    }
}