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;
}
}