1

我正在编写一个 C# 应用程序来提高我对 .NET 的基本理解,并且我想知道什么是做我需要做的事情的最佳方式。对我来说最好的方法:简单的代码和高效的使用。

我的应用程序必须使用对象(相同类型的对象,例如 AAA),并且它会创建它们的不同集合......所以我将拥有一个 AAA 集合的集合。

我的主要需求是: - 在内存中使用这个主要集合并将其持久化(序列化)在磁盘上;- 从磁盘反序列化到内存中;

另一个需要可能是: - “查询”它的数据(例如,“给我所有包含对象的集合,其中包含一个字段的指定值”)。

谢谢你的指点。

4

2 回答 2

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 序列化显然有一些细微之处,但大多数都是可以解决的。尽管二进制序列化没有所有这些问题,而且速度更快,但它有自己的问题,通常不适合长期存储。

链接:

于 2013-08-31T20:18:37.873 回答
1

在您的情况下,鉴于项目数量有限,允许您将它们全部保存在内存中,二进制序列化为平面二进制文件可能是一个很好的解决方案。查看System.Runtime.Serialization.Formatters.Binary.BinaryFormatter并查看其用法示例。

您可以对内存中的项目使用常规列表、有序列表或哈希集。如果你做平等搜索哈希集将是要走的路。如果您一直在同一唯一字段上使用搜索,请使用有序列表或字典。

此外,除非您有极端的性能要求,否则要搜索的项目数量很少(根据您的信息最多几百个),常规列表上的简单 linq 查询就可以完成这项工作。

于 2013-08-31T18:15:54.277 回答