2

我有两个这样的结构:

public struct KeyLog
{
    Keys key;
    DateTime time;
}

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

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

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

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

4

7 回答 7

2

BinaryFormatter会给你最小的压缩。此外,如果您将它们更改为类,您可以拥有一个带有DateTime time字段的基类。

于 2010-01-15T15:39:16.897 回答
1

合并它们将使它们易于编程。

但是因为您更加意识到节省磁盘空间

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

例如用于内存表示的 List List

至于将其写入磁盘,您可以将它们放在一个类中并将它们保存为一个大对象

喜欢

  [serializable]
    class BigObject 
    {

    List<Mouselog> MouseLogLst;


    List<KeyLog>  KeyLogLst ;

    }

并使用Binary Formmate 来存储它们

于 2010-01-15T15:48:46.767 回答
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);

它非常简单,而且您不必为愚蠢的 XML 序列化程序类公开所有字段和属性,因为它们总是给您带来问题。

于 2011-07-01T14:56:51.070 回答
0

除非有充分的理由将它们分开,否则您应该合并它们。我相信 KISS 在这里适用。

于 2010-01-15T15:38:41.067 回答
0

呃....你打算把它存放在哪里如果您只是想要一个可以参考的内存日志,aList<X>应该没问题。

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

然后是数据库存储...

于 2010-01-15T15:38:45.943 回答
0

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

于 2010-01-15T15:39:57.413 回答
0

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

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

于 2010-01-15T15:39:31.280 回答