代码之家  ›  专栏  ›  技术社区  ›  Pierpaolo Cira

管理和序列化对象的最佳方式[已关闭]

  •  1
  • Pierpaolo Cira  · 技术社区  · 11 年前

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

    我的应用程序必须处理对象(相同类型的,例如AAA),它会创建不同的对象集合。。。所以我会有一个AAA的集合。

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

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

    谢谢你的指示。

    2 回复  |  直到 11 年前
        1
  •  3
  •   Dmitriy Konovalov    11 年前

    听起来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>
    

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

    链接:

        2
  •  1
  •   Alex    11 年前

    在您的情况下,考虑到项的数量有限,允许您将它们全部保存在内存中,将二进制序列化到平面二进制文件可能是一个很好的解决方案。退房 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 以及关于其使用的示例。

    您可以为内存中的项目使用常规列表、有序列表或哈希集。如果你进行平等搜索,那么散列集将是最好的选择。如果你在同一个 唯一的 字段,使用有序列表或字典。

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