Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
4.093 Beiträge
 
Delphi 12 Athens
 
#1

TJSONMarshal / TJSONUnMarshal böse Falle

  Alt 1. Okt 2017, 21:40
Ich frage mich seit geraumen warum eine App plötzlich Timestamps falsch berechnet.
Der Grund war das Encoding / Decoding mit TJSONMarshal / TJSONUnMarshal.

Das hat bis dato gut funktioniert, Object zu String, und zurück, aber seit womöglich 10.1 Berlin gab es da plötzlich Probleme.
Normalerweise debugge ich nicht tief in die System Sourcen, aber hier musste es mal wieder sein

Der Grund war das TJSONMarshal / TJSONUnMarshal anscheinend neuerdings unterschiedliche IsDateTimeUTC settings per Default eingestellt haben.
Kann jetzt nicht genau sagen seit wann ...

Die Lösung war das explizit mit anzugeben, um die Konvertierungen kompatibel zu machen, also
LMar.DateTimeIsUTC := True; für Marshal/Unmarshal:

Delphi-Quellcode:
function TParcel.InternalMarshal_ToString : String;
var
  LMar : TJSONMarshal;
begin

  LMar := TJSONMarshal.Create(); // This doesn't correctly set DateTimeUTC by default

  try
      LMar.DateTimeIsUTC := True; // !!! Important to ensure same Coding/Decoding

      Result := LMar.Marshal(Self).ToString; // as TJSonObject;

  finally
      LMar.Free;
  end;

end;



function TParcel.InternalUnmarshal_FromObject(value: TJSONObject): TParcel;

var
  LMar: TJSONUnMarshal;

begin
    Result := nil;

    if not Assigned( value ) then
        Exit;

    LMar := TJSONUnMarshal.Create(); // This sets DateTimeIsUTC internally by default

    try
        LMar.DateTimeIsUTC := True; // !!! Important to ensure same Coding/Decoding

        ...
        ...
        ...


    finally
        LMar.Free;
    end;
end;

Wenn es nicht gleich gesetzt wird kann es zu einer Zeitdifferenz dei Encode/Decode kommen von 2:00h.
Das ist definitiv nicht das was ich erwarten würde

Rollo

Geändert von Rollo62 ( 1. Okt 2017 um 21:55 Uhr)
  Mit Zitat antworten Zitat