管理和序列化对象的最佳方法

时间:2013-08-31 16:56:30

标签: c# serialization collections

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

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

我的主要需求是: - 在内存中使用此主集合并在磁盘上保留(序列化)它; - 从磁盘反序列化到内存中;

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

谢谢你的指示。

2 个答案:

答案 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查询可以很好地完成工作。