У меня есть две такие структуры:
public struct KeyLog
{
Keys key;
DateTime time;
}
public struct MouseLog
{
MouseEvents mouse;
Point coordinates;
DateTime time;
}
Для каждой клавиши клавиатуры нажмите и нажмите кнопку мыши. Я хочу сохранить эти данные, но я не знаю, какой способ был бы наиболее эффективным для хранения и обработки? Есть ли более эффективные способы обработки данных - я не уверен, что использование двух структур лучше, чем объединение обоих в один?
Изменить: Я делаю приложение статистики клавиатуры и мыши, в котором будет храниться количество нажатий клавиш и щелчков мыши, а также какая кнопка была нажата, где и когда для моего компьютера и я хотел бы сохранить эти данные каждый раз при нажатии кнопки. Не обязательно записывать на диск каждый раз, но, по крайней мере, хранить его в памяти, пока я не хочу сохранить его на диск.
Изменить: Я думал, что если я сохраню две структуры отдельно, я не буду создавать слишком много мертвых данных, когда я их сохраню, а затем я могу легко выполнить поиск/сортировку, если я сохраню их отдельно. Мысли?
A BinaryFormatter даст вам наименьшее сжатие. Также, если вы измените их на классы, вы можете получить базовый класс с полем DateTime time
.
Я часто сохраняю его последовательно в двоичном файле с очень простым уровнем доступа к данным. Есть несколько подходов, которые вы можете использовать здесь, но мне это нравится больше всего, это довольно просто и быстро. Вы даже можете создать индексную таблицу для записей в файле очень легко и многое другое.
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, которые постоянно вызывают проблемы.
Объединяя их, они упростят программирование с помощью.
BUt, поскольку вы более сознательно сохраняете дисковое пространство
Вы можете использовать общую коллекцию MouseLog и Keylog
например, список Список в представлении памяти
AS для записи на диск, вы можете поместить их в класс и сохранить их как один большой объект
как
[serializable]
class BigObject
{
List<Mouselog> MouseLogLst;
List<KeyLog> KeyLogLst ;
}
и используйте Binary Formmater для их хранения
er.... где вы собираетесь его хранить? Если вам просто нужен журнал в памяти, на который вы можете ссылаться, List<X>
должен быть в порядке.
Если вы хотите передать его на диск, вы захотите его сериализовать. Двоичная сериализация является наиболее эффективной с точки зрения общего дискового пространства, но сериализация XML является "читаемой человеком".
Тогда есть хранилище базы данных...
Я бы сохранил его в одной структуре, и это, скорее всего, сэкономит ваше время как программиста. С этим будет проще справиться, особенно при сохранении/загрузке файла позже. Мало что можно получить от использования структурированных вами описаний.
И если это должно стать проблемой производительности, просмотрите код, где есть узкие места, а затем исправьте их.
Если есть веская причина, чтобы держать их в отдельности, вы должны объединить их. KISS применяется здесь, я считаю.
Вам нужно беспокоиться о Unicode или это может быть ASCII? Я бы сказал, что это ваш друг. Не сливайте их, а создавайте оба класса, которые являются и детьми абстрактного EventLog. Класс EventLog должен принудительно использовать метод toString(), возможно, несколько других. Затем укажите список EventLogs, где каждый EventLog - KeyLog или MouseLog. Интересно, изобретаете ли вы колесо...