Как мне сохранить мои данные? - PullRequest
2 голосов
/ 15 января 2010

У меня есть две структуры, такие как:

public struct KeyLog
{
    Keys key;
    DateTime time;
}

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

Для каждого нажатия клавиши клавиатуры и нажатия кнопки мыши я хочу сохранить эти данные, но я не знаю, какой способ будет наиболее эффективным для их хранения / обработки? Есть ли лучшие способы обработки данных - я не уверен, что лучше использовать две структуры, чем объединять обе в одну?

Редактировать: Я делаю статистическое приложение для клавиатуры и мыши, которое будет хранить количество нажатий клавиш и щелчков мыши, а также то, какая кнопка была нажата, где и когда для моего компьютера, и я бы хотите сохранить эти данные при каждом нажатии кнопки. Не обязательно каждый раз записывать на диск, но, по крайней мере, сохранять его в памяти, пока я не захочу сохранить его на диск.

Редактировать: Я думал, что если я буду хранить две структуры отдельно, я не буду создавать слишком много мертвых данных, когда сохраню их, а затем я могу легко искать / сортировать, если я храню их отдельно. Мысли?

Ответы [ 7 ]

2 голосов
/ 15 января 2010

A BinaryFormatter даст вам минимальное сжатие. Также, если вы измените их на классы, у вас может быть базовый класс с полем DateTime time.

1 голос
/ 01 июля 2011

Я часто сохраняю его последовательно в двоичный файл с очень простым слоем доступа к данным. Есть несколько подходов, которые вы можете использовать здесь, но мне больше всего нравится этот, он довольно простой и быстрый. Вы даже можете очень легко создать таблицу индексов для записей в файле и многое другое.

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-сериализатора, которые постоянно вызывают проблемы.

1 голос
/ 15 января 2010

Объединение их упростит программирование с помощью ..

Но, если вы больше заботитесь о экономии дискового пространства

Вы можете использовать общую коллекцию MouseLog и Keylog

например, список Список для представления в памяти

КАК для записи на диск вы можете поместить их в класс и сохранить их как один большой объект

как

  [serializable]
    class BigObject 
    {

    List<Mouselog> MouseLogLst;


    List<KeyLog>  KeyLogLst ;

    }

и использовать Бинарный Formmater хранить их

0 голосов
/ 15 января 2010

Вам нужно беспокоиться о Unicode или это может быть ASCII? Я бы сказал, что XML твой друг. Не объединяйте два, но сделайте оба класса, которые оба являются дочерними объектами абстрактного EventLog. Класс EventLog должен навязать вам метод toString (), может быть, несколько других. Затем создайте список EventLogs, где каждый EventLog является KeyLog или MouseLog. Интересно, ты изобретаешь колесо?

0 голосов
/ 15 января 2010

Я бы сохранил это в одной структуре, потому что это, скорее всего, сэкономит ваше время как программиста. Это будет проще, особенно при сохранении / загрузке файла позже. Использование структур, которые вы описали, мало что дает.

И если это станет проблемой производительности, профилируйте код, посмотрите, где есть узкие места, и исправьте их.

0 голосов
/ 15 января 2010

er .... где вы планируете хранить его? Если вам нужен только журнал в памяти, к которому вы можете обратиться, List<X> подойдет.

Если вы хотите транслировать его на диск, вам нужно его сериализовать. Двоичная сериализация является наиболее эффективной с точки зрения общего дискового пространства, но XML-сериализация «удобочитаема для человека».

Тогда есть хранилище базы данных ...

0 голосов
/ 15 января 2010

Если нет веских причин для их разделения, вам следует объединить их. Поцелуй здесь, я верю.

...