Accurately serializing and deserializing a SysTime in binary format
Ecstatic Coder
ecstatic.coder at gmail.com
Tue Jul 21 12:26:50 UTC 2020
On Tuesday, 21 July 2020 at 12:21:16 UTC, Steven Schveighoffer
wrote:
> On 7/21/20 7:44 AM, Ecstatic Coder wrote:
>> On Tuesday, 21 July 2020 at 11:01:20 UTC, drug wrote:
>>> On 7/20/20 10:04 PM, Ecstatic Coder wrote:
>>>> I'm currently implementing a small open source backup tool
>>>> (dub), and therefore I need to accurately store the file
>>>> modification SysTime in binary format, so that I can later
>>>> load this SysTime from the snapshot file to compare it with
>>>> the current file modification SysTime.
>>>>
>>>> Having unfortunately not understood how to do this from the
>>>> SysTime documentation, in despair, I've tried to directly
>>>> serialize the 16 bytes of the SysTime value. This worked
>>>> fine until I call the ".toISOString()" on the deserialized
>>>> SysTime, which inevitably crashes the executable ;)
>>>
>>> That is probably a bug. I serialize SysTime as long by means
>>> msgpack for exchanging between C++ client and D server and it
>>> works pretty nice.
>>>
>>
>> Ah thanks for telling me :)
>>
>> The loaded byte array in the union type was indeed the same as
>> the saved one, so I immediately thought it was crashing
>> because of some hidden pointer for timezone or something which
>> was then pointing to garbage at reloading, causing the crash
>> of the ".toISOString" call.
>
> Not a bug.
>
> 8 of those 16 bytes is a pointer to the timezone, which is
> going to be different on different processes.
>
> What you should do I think is serialize the stdTime [1], and
> set the time zone to whatever you want:
>
> long serialize(SysTime st) { return st.stdTime; }
> SysTime deserialize(long st) { return SysTime(st, UTC()); }
>
> The stdTime is always stored as UTC to make math a lot easier.
> The time zone is only used for display.
>
> -Steve
>
> [1]
> https://dlang.org/phobos/std_datetime_systime.html#.SysTime.stdTime
Smart :)
Now I understand my mistake was to try to directly serialize a
SysTime as provided by the "getTimes" function, instead of
converting it to a StdTime, which is more versatile...
More information about the Digitalmars-d-learn
mailing list