我该如何保存我的数据?

时间:2010-01-15 15:35:40

标签: c# serialization information-retrieval

我有两个这样的结构:

public struct KeyLog
{
    Keys key;
    DateTime time;
}

public struct MouseLog
{
    MouseEvents mouse;
    Point coordinates;
    DateTime time;
}

对于每个键盘按键和鼠标按钮单击我希望保存此数据,但我不知道哪种方式最有效存储/处理它?有没有更好的方法来处理数据 - 我不确定使用两个结构是否比将它们合并为一个更好?

编辑:我正在做一个键盘&鼠标统计应用程序,它将存储按键的数量&鼠标点击以及按下了什么按钮,我的计算机的位置和时间,每次按下按钮时我都想保存这些数据。不一定每次写入磁盘,但至少将其存储在内存中,直到我想将其保存到磁盘。

编辑:我认为如果我将这两个结构分开,那么当我存储它们时,我不会创建太多死数据,然后我可以轻松搜索/排序,如果我将它们分开。想法?

7 个答案:

答案 0 :(得分:2)

BinaryFormatter会给你最小的压缩。此外,如果将它们更改为类,则可以使用具有DateTime time字段的基类。

答案 1 :(得分:1)

合并它们会使它们很容易编程......

因为你更有意识地节省磁盘空间而烦恼

您可以使用MouseLog和Keylog的通用集合

例如List    内存表示列表

将它写入磁盘的AS可以将它们放在一个类中并将它们保存为一个Big对象

  [serializable]
    class BigObject 
    {

    List<Mouselog> MouseLogLst;


    List<KeyLog>  KeyLogLst ;

    }

并使用Binary Formmater  存储它们

答案 2 :(得分:1)

我经常将它按顺序保存到具有非常简单的数据访问层的二进制文件中。你可以在这里使用一些方法,但我最喜欢这个,它很简单,速度很快。您甚至可以非常轻松地为文件中的条目创建索引表。

class Foo {
  private int _someInteger;
  private string _someString;

  public virtual void Serialize(BinaryWriter writer) {
    writer.Write(2); // A simple versioning, start at 0, then increment.
    writer.Write(_someString);
    writer.Write(_someInteger);
  }

  public virtual void Deserialize(BinaryReader reader) {
    int version = reader.ReadInt32();
    switch (version) {
      case 2: // the string was only added in version 2 of the class serialization.
        _someString = reader.ReadString(); 
        goto case 1;
      case 1: // continue at case 1.
        _someInteger = reader.ReadInt32();
        break; // break here, because version 0 was very different.
      case 0: // in version 0 of the class there was actually a double, but it was always an integral number, so this basically is a conversion case.
        _someInteger = (int)reader.ReadDouble();
        break;
    }
  }
}

请注意从文件中按照与编写文件相同的顺序阅读文件。

然后你可以从流中传递读者和作者,例如

Foo fooInstance = new Foo();
FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(fileStream);

fooInstance.Deserialize(reader);

它非常简单,您不必使用set-accessors公开所有字段和属性,以便为您提供始终存在问题的愚蠢XML序列化程序类。

答案 3 :(得分:0)

除非有充分理由将它们分开,否则应合并它们。我相信KISS适用于此。

答案 4 :(得分:0)

呃.... 你想计划存储吗?如果您只想要一个可以引用的内存日志,List<X>应该没问题。

如果要将其流式传输到磁盘,则需要对其进行序列化。就总磁盘空间而言,二进制序列化是最有效的,但XML序列化是“人类可读的”。

然后是数据库存储......

答案 5 :(得分:0)

我会将它存储在一个结构中,因为它最有可能节省你作为程序员的时间。处理起来会更简单,特别是在以后保存/加载文件时。使用你所描述的结构几乎没有什么好处。

如果这应该成为性能问题,请查看代码,查看任何瓶颈所在,然后修复它们。

答案 6 :(得分:0)

您是否需要担心Unicode或者这可能是ASCII?我会说XML是你的朋友。不要合并这两个,而是创建两个类,它们都是抽象EventLog的子类。 EventLog类必须强制使用toString()方法,也许还有其他一些方法。然后有一个EventLogs列表,其中每个EventLog是一个KeyLog或一个MouseLog。我想知道你是否正在重新发明轮子......