Как мне сохранить мои данные?

2

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

public struct KeyLog
{
    Keys key;
    DateTime time;
}

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

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

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

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

  • 0
    Я предполагаю, что в вашем приложении поля являются открытыми?
  • 0
    Где вы хотите сохранить эти данные? Текстовый файл, база данных?
Показать ещё 3 комментария
Теги:
serialization
information-retrieval
store-data

7 ответов

2
Лучший ответ

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

  • 0
    +1 я люблю этот ответ!
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, которые постоянно вызывают проблемы.

1

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

BUt, поскольку вы более сознательно сохраняете дисковое пространство

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

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

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

как

  [serializable]
    class BigObject 
    {

    List<Mouselog> MouseLogLst;


    List<KeyLog>  KeyLogLst ;

    }

и используйте Binary Formmater  для их хранения

0

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

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

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

0

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

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

0

Если есть веская причина, чтобы держать их в отдельности, вы должны объединить их. KISS применяется здесь, я считаю.

  • 0
    Это может тратить пространство, хотя.
0

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

  • 0
    Разве XML не использует ненужное пространство? Это не так много информации, которую я хочу хранить, но сегодня я нажал более 25 тыс. Клавиш и 5 тыс. Щелчков мыши, и это заняло бы много места. Думаю, это правильный термин, если я использую XML?
  • 0
    Хорошо, тогда используйте простой формат ASCII: [YYMMDDhhmmss FF] [YYMMDDhhmmss 123,254 R] [YYMMDDhhmmss 123,254 L] [YYMMDDhhmmss 124,256] [YYMMDDhhmmss 45] - здесь клавиши FF, 45 с шестнадцатеричным представлением (при нажатии на клавиши ASCII 45 (при нажатии на шестнадцатеричное представление) нажимаются шестнадцатеричные представления (при нажатии клавиш ASCII 45). Тем не менее, я бы порекомендовал использовать классы. Написание должно быть легко. Разбор - тоже не сложно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню