我正在编写一个C#应用程序来提高我对.NET的基本理解,我想知道什么是我需要的最佳方法。 对我来说最好的方法:编码简单,使用效率高。
我的应用程序必须使用对象(相同类型的对象,例如AAA),并且它会创建不同的集合...所以我将拥有AAA的集合集合。
我的主要需求是: - 在内存中使用此主集合并在磁盘上保留(序列化)它; - 从磁盘反序列化到内存中;
另一个需求可能是: - “查询”其数据(例如“给我所有包含对象具有指定字段值的集合”)。
谢谢你的指示。
答案 0 :(得分:3)
听起来像xml序列化可能是您的最佳选择。它易于实现,易于存储,易于查看,易于编辑等。
例如,您有一个AAA类,其中定义了一些公共属性:
public class AAA
{
public Guid Id {get; set;}
public string Name {get; set;}
public int Value {get; set;}
}
和集合类:
public class AAACollection
{
public string Name { get; set; }
public List<AAA> Items { get; set; }
}
您填写您的收藏品如下:
AAA a = new AAA ();
a.Id = Guid.NewGuid ();
a.Name = "test";
a.Value = 12;
AAACollection coll = new AAACollection ();
coll.Name = "First collection";
coll.Items = new List<AAA>();
coll.Items.Add (a);
序列化到xml很简单:
XmlSerializer xs = new XmlSerializer (typeof(AAACollection));
Stream s = File.OpenWrite(@"d:\test.xml");
xs.Serialize (s, coll);
s.Close ();
Xml将是这样的:
<AAACollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Items>
<AAA>
<Id>b5d4f0ab-f34e-4a55-91db-f4737869f81b</Id>
<Name>test</Name>
<Value>12</Value>
</AAA>
</Items>
<Name>First collection</Name>
</AAACollection>
来自xml的反序列化也很简单:
XmlSerializer xs = new XmlSerializer (typeof(AAACollection));
Stream s = File.OpenRead(@"d:\test.xml");
AAACollection coll = (AAACollection)xs.Deserialize (s);
s.Close ();
如果使用xml序列化保留对象,则可以搜索某些数据而无需将其实际加载到内存中。例如,您可以搜索xml文件或查询数据库中的记录,并仅反序列化找到的项目。
当然,XML序列化与二进制序列化不同。例如,XML序列化仅序列化公共属性。或者你没有无参数构造函数的类会有一些困难。 XML序列化显然有一些细节,但大多数都是可以解决的。尽管二进制序列化没有所有这些问题并且速度更快,但它有其自身的问题,并且通常不适合长期存储。
链接:
答案 1 :(得分:1)
在您的情况下,由于项目数量有限,允许您将它们全部保存在内存中,二进制序列化为平面二进制文件可能是一个很好的解决方案。查看System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
及其使用示例。
您可以为内存中的项目使用常规列表,有序列表或哈希集。如果你做了相等的搜索,那么hashsets就是你要走的路。如果您始终在同一唯一字段中使用搜索,请使用有序列表或字典。
此外,除非您有极端的性能要求,否则考虑到要搜索的项目数量较少(根据您的信息最多几百个),常规列表上的简单linq查询可以很好地完成工作。