2011-08-27 54 views
0

我有以下方法进行序列化的类的列表磁盘:如何最佳序列化实体在C#中的列表

private static void Serialize(List<CcmAlarmUalUsl> entityList) 
{ 
    try 
    { 
     using (Stream stream = File.Open("CcmAlarmUalUsl.dat", FileMode.Create)) 
     { 
      BinaryFormatter bin = new BinaryFormatter(); 
      bin.Serialize(stream, entityList); 
     } 
    } 
    catch (IOException) 
    { 
    } 
} 

实体类我想序列如下所示:

public class CcmAlarmUalUsl 
{ 
    public string SubId { get; set; } 

    public System.DateTime TimeOfAlarm { get; set; } 

    public int AlarmType { get; set; } 
} 

我的Serialize类是将实体列表序列化到磁盘的最佳方式吗?这并不需要人类可读。它将被应用程序严格使用,作为内部缓存的存储手段。没有数据库存储是必要的。

我也有点担心什么时候修改CcmAlarmUalUsl的结构。我可以添加属性到类的最后。这将如何影响现有的缓存项目?

+0

什么是'lizards1'?你是否认为这是'entityList'? –

+0

您对序列化数据的要求是什么?如果你的要求是序列化的数据是人类可读的,那么没有BinaryFormatter不是最好的解决方案,XmlSerializer可能是一个更好的选择。你的代码也不是很清楚,你序列化了一个名为'lizards1'的变量,但函数接受了enityList,它是你想要序列化的entityList? –

+0

对不起 - lizards1是一个错字。 – Hosea146

回答

1

简单的答案 - 没有。您的代码不会编译(lizards1 ??),并且您的CcmAlarmUalUs1类未标记为可序列化(运行时错误)。将你的CcmAlarmUrlUs1类标记为可串行化,将lizards1更改为entityList,它应该可以正常工作,看起来你正在做的事情很好。

虽然你的问题有点模糊。 '最好',你在找什么?如果不知道,真的很难给出一个好的答案。

+0

谢谢。 'Lizards1'是一个错字。这并不需要人类可读。它严格地作为应用程序存储机制来存储缓存的项目列表。这并不需要持久保存在数据库中。我已更新我的帖子以包含其他要求。 – Hosea146

2

最好的方法,取决于您的应用需求。 二进制序列化(标准版)在硬盘上使用的内存通常很便宜,但不是非常具有可扩展性,因为有一次您重构代码,您将面临反序列化先前保存的二进制文件的问题。哪个可以解决,但我个人不喜欢这种方法,尽量避免它。

考虑:

  1. XML序列化
  2. JSON序列
  3. 保存对象的SQLite数据库与一些轻量级ORM。
  4. 定制二进制序列化...

还有很多其他类型的存在,但是这些的恕我直言,在这些日子里更加化解的。

希望这会有所帮助。

+0

我同意并补充说Json序列化创建的数据比XML序列化要小 –