AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

InstanceSize in D3 und D7

Ein Thema von MrSpock · begonnen am 20. Jun 2005 · letzter Beitrag vom 20. Jun 2005
Antwort Antwort
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#1

InstanceSize in D3 und D7

  Alt 20. Jun 2005, 07:24
Hallo,

ich habe eine Klasse von TObject abgeleitet. Diese enthält 5 Extended Werte, einen constructor, einen destructor und 2 Methoden. In D3 hat diese Klasse eine InstanceSize von 56 Bytes in D7 aber 60!? Wie kommt es zu dieser Vergrößerung. Da ich die Objekte in einen Stream schreibe und aus diesem wieder lese, hab ich in D7 jetzt das Problem, dass ich den Stream, den ich mit D3 geschrieben habe nicht mehr korrekt lesen kann.

Ich habe mich darauf verlassen, dass die Eigenschaften der Objekte jeweils 4 Bytes nach dem Objektanfang beginnen, wie es auch dieser Code aus der Code-Lib tut.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.610 Beiträge
 
#2

Re: InstanceSize in D3 und D7

  Alt 20. Jun 2005, 07:39
Ouch. Hat sich ggf. die Größe eines der Elemente geändert? Schau mal in der RTTI nach, die müsste die Informationen dazu liefern.

Eine Lösung wäre, die alte Deserialisierung in D3 zu nehmen, die Werte in ein XML-Format (oder in Strings zeilenweise in textdateien oder...) zu packen und die Serialisierung dann in D7 zu nehmen und aus dem XML wieder in den usprünglichen Stream packen. Sind dann halt zwei neue Tools zum konvertieren, aber die Hälfte vom Code ist ja schon da, von daher kann man den Aufwand relativ gering halten.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: InstanceSize in D3 und D7

  Alt 20. Jun 2005, 07:41
naja, macht es überhaupt sinn das gesammte Object abzuspeichern? Wozu braucht man dann Constructor, Destructor etc. beim abspeichern. Wäre es nicht sinnvoller gewesen nur die Werte zu speichern die auch wirklich gespeichert werden müssen?

Das die Objecte sich zwischen den Delphiversionen unterscheiden sollte einem doch irgendwo klar sein. Spätestens bei 64Bit-Delphi kommt es dann zu Problemen...
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#4

Re: InstanceSize in D3 und D7

  Alt 20. Jun 2005, 07:52
Hallo Phoenix und SirThornberry,

ich speichere ähnlich wie im oben verlinktem Code die Eigenschaften des Objektes ab. Dazu nutze ich auch die Eigenschaft InstanceSize. Ich habe jetzt einfach einmal anstatt 4 Bytes bis zum Beginn der Eigenschaften 8 Bytes benutzt und es funktioniert. Grundlage des Programms von Chewie und auch meiner Speicherroutine war diese Borlandseite zur Speicherverwaltung. Diese galt für D5, und gilt offensichtlich nicht mehr für D7. Hat einer einen Link zur Speicherverwaltung unter D7?
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.610 Beiträge
 
#5

Re: InstanceSize in D3 und D7

  Alt 20. Jun 2005, 08:00
Zitat von SirThornberry:
naja, macht es überhaupt sinn das gesammte Object abzuspeichern? Wozu braucht man dann Constructor, Destructor etc. beim abspeichern. Wäre es nicht sinnvoller gewesen nur die Werte zu speichern die auch wirklich gespeichert werden müssen?
Wird doch gemacht.
Die Methoden auf dem Objekt liegen sowieso nie im Objekt selber, sondern nur einmal im kompletten Programm. Die RTTI weiss wo die Methode liegt, im Objekt selber liegt - wenn überhaupt, das weiss ich leider nicht zu 100% - ein Pointer auf den ausführbaren Codebereich.

Deswegen muss bei Methoden ja auch immer ein Pointer auf den Datenbereich der aufrufenden Instanz als erster (versteckter) Parameter an den Codebereich übergeben werden, damit man überhaupt auf den Properties des richtigen Objektes arbeitet.

Das hat auch den manchmal unangenehmen Nebeneffekt, das man Methoden auf Objekten aufrufen kann, die schon freigegeben sind. - Wenn diese Methoden nicht auf Properties des Objektes zugreifen sondern z.B. reine Berechnungen auf den Parametern machen, dann funktioniert das sogar. Nur wenn ein Property geändert werden soll, dann kommt es zu einer Speicherschutzverletzung, weil der Speicher für das Objekt ja schon bei der Freigabe an das OS zurückgegeben wurde.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#6

Re: InstanceSize in D3 und D7

  Alt 20. Jun 2005, 08:16
Zitat von MrSpock:
ich speichere ähnlich wie im oben verlinktem Code die Eigenschaften des Objektes ab.
Mein Vorschlag wäre TReader und TWriter zu benutzen.
Delphi-Quellcode:
type
  TMyObject = class(TObject)
  private
    FValueA: Integer;
    FValueB: String;
  public
    procedure SaveToStream(AStream: TStream);
    procedure LoadFromStream(AStream: TStream);
    property ValueA: Integer read FValueA write FValueA;
    property ValueB: String read FValueB write FValueB;
  end;
Delphi-Quellcode:
procedure TMyObject.LoadFromStream(AStream: TStream);
begin
  with TReader.Create(AStream, 4096) do
    try
      FValueA := ReadInteger;
      FValueB := ReadString;
    finally
      Free;
    end;
end;

procedure TMyObject.SaveToStream(AStream: TStream);
begin
  with TWriter.Create(AStream, 4096) do
    try
      WriteInteger(FValueA);
      WriteString(FValueB);
    finally
      Free;
    end;
end;
Ist deine Klasse von TComponent abgeleitet, kannst du auch WriteComponent und ReadComponent benutzen.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#7

Re: InstanceSize in D3 und D7

  Alt 20. Jun 2005, 08:19
Hallo Sprint,

ich wollte mir die Arbeit sparen, jedes Element einzeln speichern zu müssen. War es früher nicht einmal so, dass bereits TPersistent Lade und Speichermöglichkeiten für die Eigenschaften angeboten hat?
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#8

Re: InstanceSize in D3 und D7

  Alt 20. Jun 2005, 08:27
Zitat von MrSpock:
ich wollte mir die Arbeit sparen, jedes Element einzeln speichern zu müssen.
Vielleicht wärst du jetzt schon fertig.

Zitat:
War es früher nicht einmal so, dass bereits TPersistent Lade und Speichermöglichkeiten für die Eigenschaften angeboten hat?
DefineProperties
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz