Alexey,

Just to clarify before we start the discussion:
this proposal seems to introduce some breaking changes, so we are talking
about Ignite 3.0, correct?

Pavel

On Tue, Nov 3, 2020 at 12:13 AM Alexey Kukushkin <kukushkinale...@gmail.com>
wrote:

> Igniters,
>
> What do you think about changing .NET API to read/write portable dates by
> default and making that really portable?
>
> *The Problem*
> Presently .NET API writes dates as composite Ignite objects. Only .NET
> clients can read such dates: any other client (JDBC, Java, etc) does not
> understand it without custom deserialization.
>
> It is still possible to configure .NET serialization to write dates as
> Ignite dates - see DateTime Serialization note
> <
> https://ignite.apache.org/docs/latest/net-specific/net-platform-interoperability#types-compatibility
> >.
> But then Ignite accepts only UTC dates, requiring the application
> developers to convert local dates to UTC dates and back. This task is not
> trivial: DateTime.ToUniversalTime
> <
> https://docs.microsoft.com/en-us/dotnet/api/system.datetime.touniversaltime?view=netcore-3.1
> >
> uses
> calendars different from Java (and the .NET calendars are the invalid ones
> - especially for pre-1990 dates).
>
> The motivation for the current default behavior was probably the desire to
> keep the Time Zone information: Ignite dates do not store time zones.
>
> In our experience interoperability is more important than storing time zone
> info.
>
> *The Proposal*
>
>    1. Always write .NET dates as portable Ignite dates: get rid of the
>    BinaryReflectiveSerializer.ForceTimestamp flag that currently triggers
> this
>    behavior.
>       - We could still keep the ForceTimestamp flag if saving .NET dates as
>       transparent objects seems a useful case. We do not think it is
> useful.
>    2. Automatically convert Local dates to UTC and back *inside*
>    Ignite.NET.
>       - In this case we lose the DateTime.Kind of UTC dates: we write a UTC
>       date but we would read a Local date since Ignite would always
> convert UTC
>       to Local when reading.
>       We could add a UtcDate date flag to QuerySqlFieldAttribute
>       and BinaryReflectiveSerializer to control the deserialization
> behavior if
>       keeping dates in UTC format use case seems important.
>    3. Use NodaTime <https://nodatime.org/> for UTC<->Local conversions.
>    Noda time uses Java calendars making the conversion truely portable.
>
> *The Benefits*
>
>    1. We think portable dates are much more important than storing time
>    zone info. Why do we store time zones for every date on the server
> anyway?
>    Time zone is client-side info.
>    2. Simpler application code: no more manual configuration to trigger the
>    portable behavior.
>    3. Non-trivial code to make the truly portable UTC<->Local conversion is
>    implemented once inside Ignite instead of having every Ignite.NET
>    application implementing it.
>
> Thank you!
>
> --
> Best regards,
> Alexey
>

Reply via email to