Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 集合存储库实现,能够处理序列化_C#_Serialization_Xml Serialization_Datacontractserializer - Fatal编程技术网

C# 集合存储库实现,能够处理序列化

C# 集合存储库实现,能够处理序列化,c#,serialization,xml-serialization,datacontractserializer,C#,Serialization,Xml Serialization,Datacontractserializer,我有几个外观相同但操作不同类型的集合项的集合,如下所示: [CollectionDataContract(ItemName = "Culture")] public sealed class Cultures : List<LangCult> { } 你的想法 请不要给出关于如何序列化的说明,因为这不是问题所在,我已经让它工作了。也许我应该说我想要一个通用集合接口,其中包含具有公共基类的通用项。这就是我如何解决它的,希望有一天有人会发现它有用 /// <summary>

我有几个外观相同但操作不同类型的集合项的集合,如下所示:

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


请不要给出关于如何序列化的说明,因为这不是问题所在,我已经让它工作了。

也许我应该说我想要一个通用集合接口,其中包含具有公共基类的通用项。这就是我如何解决它的,希望有一天有人会发现它有用

/// <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;
    }
}
//
///此回购协议使我们能够处理可序列化的集合。集合类已被删除
///要从IEnumerable继承,必须使用CollectionDataContract属性进行描述
/// 
/// 
公共接口ICollectionsRepository,其中T:集合
{
/// 
///从数据存储获取集合
/// 
///项目清单
T载荷();
/// 
///将新集合项添加到数据存储
/// 
///要添加到集合中的项
无效添加(V项);
}
公共类XmlCollectionsProvider:ICollectionsRepository其中T:Collection,new(),其中V:CollectionItem
{
私有只读字符串_file=Path.Combine(XmlProvider.DataStorePhysicalPath,typeof(T).Name+“.xml”);
公共交通荷载()
{
如果(!DefaultsExist()){
CreateDefaults();
}
DataContractSerializer dcs=新的DataContractSerializer(类型(T));
T obj=null;
XmlDictionaryReader阅读器=
XmlDictionaryReader.CreateTextReader(新文件流(_file,FileMode.Open,FileAccess.Read),
新的XmlDictionaryReaderQuotas());
obj=(T)dcs.ReadObject(reader,true);
reader.Close();
返回obj;
}
公共作废添加(V项)
{
T collection=Load();
集合。添加(项目);
保存(收集);
}
}
[CollectionDataContract(ItemName=“Culture”)]
公共密封类区域性:列表{}
[数据合同]
公共类LangCult:集合项
{
...
}
[数据合同]
公共抽象类集合项
{
[数据成员]
公共字符串Id
{
收到
设置
}
}

问题是什么?使用List作为基类并不是一个好主意。您应该改用Collection。这是专门为扩展而做的。
/// <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;
    }
}