2 Stimmen

Wie soll ich meine Daten speichern?

Ich habe zwei Strukturen wie folgt:

public struct KeyLog
{
    Keys key;
    DateTime time;
}

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

Für jeden Tastendruck und Mausklick möchte ich diese Daten speichern, aber ich weiß nicht, welcher Weg am effizientesten ist, um sie zu speichern/behandeln. Gibt es bessere Möglichkeiten, die Daten zu verarbeiten - ich bin mir nicht sicher, ob es besser ist, beide in einer Struktur zu vereinigen?

Bearbeiten: Ich arbeite an einer Tastatur- und Mausstatistik-Anwendung, die die Anzahl der Tastendrücke und Mausklicks sowie welcher Knopf gedrückt wurde, wo und wann für meinen Computer speichern soll und ich möchte diese Daten jedes Mal speichern, wenn eine Taste gedrückt wird. Nicht unbedingt jedes Mal auf die Festplatte schreiben, aber zumindest in den Speicher speichern, bis ich sie auf die Festplatte speichern möchte.

Bearbeiten: Ich dachte, dass wenn ich die beiden Strukturen getrennt halte, ich nicht zu viele redundante Daten erzeugen werde, und dann kann ich sie einfach suchen/sortieren, wenn ich sie getrennt halte. Was denkst du?

0 Stimmen

Ich gehe davon aus, dass in Ihrer Anwendung die Felder öffentlich sind?

0 Stimmen

Wo möchtest du diese Daten speichern? In einer Textdatei, einer Datenbank?

0 Stimmen

Was bedeutet Speichern? Meinst du damit das Schreiben auf eine Festplatte?

2voto

Yuriy Faktorovich Punkte 64670

Ein BinaryFormatter würde die kleinste Kompression bieten. Wenn Sie sie außerdem in Klassen ändern, könnten Sie eine Basisklasse mit einem DateTime time Feld haben.

1voto

Vivek Bernard Punkte 2043

Das Zusammenführen von ihnen wird es einfacher machen, mit ihnen zu programmieren..

Aber da Sie bewusster sind, Speicherplatz zu sparen

Sie könnten eine generische Sammlung von MouseLog und Keylog verwenden

Zum Beispiel List Liste für die interne Speicherung

Was das Schreiben auf eine Festplatte betrifft, könnten Sie sie in eine Klasse stecken und sie als ein großes Objekt speichern

wie

  [serialisierbar]
    Klasse BigObject 
    {

    List MouseLogLst;

    List  KeyLogLst ;

    }

und verwenden Sie Binary Formmater um sie zu speichern

1voto

Daniel Monzert Punkte 11

Ich speichere es oft sequenziell in eine binäre Datei mit einer sehr einfachen Datenzugriffsschicht. Es gibt hier ein paar Ansätze, die Sie verwenden können, aber ich mag diesen am liebsten, er ist ziemlich einfach und schnell. Sie können sogar sehr einfach eine Index-Tabelle für Einträge in der Datei erstellen und vieles mehr.

class Foo {
  private int _someInteger;
  private string _someString;

  public virtual void Serialize(BinaryWriter writer) {
    writer.Write(2); // Eine einfache Versionierung, beginnt bei 0 und wird dann inkrementiert.
    writer.Write(_someString);
    writer.Write(_someInteger);
  }

  public virtual void Deserialize(BinaryReader reader) {
    int version = reader.ReadInt32();
    switch (version) {
      case 2: // der String wurde erst in Version 2 der Klassenserialisierung hinzugefügt.
        _someString = reader.ReadString(); 
        goto case 1;
      case 1: // fortsetzen bei Fall 1.
        _someInteger = reader.ReadInt32();
        break; // hier abbrechen, da Version 0 sehr unterschiedlich war.
      case 0: // in Version 0 der Klasse gab es tatsächlich ein double, aber es war immer eine ganze Zahl, also ist dies im Grunde ein Konvertierungsfall.
        _someInteger = (int)reader.ReadDouble();
        break;
    }
  }
}

Achten Sie einfach darauf, dass Sie sie in derselben Reihenfolge aus der Datei lesen, wie Sie sie schreiben.

Sie könnten es dann einfach den Lesern und Schreibern aus einem Stream übergeben, z.B.

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

fooInstance.Deserialize(reader);

Es ist so einfach und Sie müssen nicht alle Felder und Eigenschaften mit Set-Accessoren für die dummen XML-Serializer-Klassen freigeben, die Ihnen die ganze Zeit Probleme bereiten.

0voto

Hogan Punkte 65759

Es sei denn, es gibt einen guten Grund, sie getrennt zu halten, sollten Sie sie zusammenführen. Ich glaube, hier gilt KISS.

0voto

Randolpho Punkte 54011

Er... wo planst du, es zu speichern? Wenn du nur ein in-memory Log haben möchtest, auf das du verweisen kannst, sollte eine List ausreichen.

Wenn du es auf die Festplatte streamen möchtest, musst du es serialisieren. Die binäre Serialisierung ist hinsichtlich des Gesamtfestplattenspeicherplatzes am effizientesten, aber die XML-Serialisierung ist "human readable".

Dann gibt es noch die Datenbankspeicherung...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X