Потеря точности при сохранении параметра DateTimeOffset в настройках проекта

Когда я сохраняю DateTimeOffest в настройках своего проекта, я теряю некоторую точность: Потеря точности при сериализации DateTimeOffset

Первая переменная — это исходное значение до сериализации. Второе — это значение после десериализации.

На самом деле моя переменная сериализуется вот так в файле конфигурации:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <userSettings>
        <MyApp.Properties.Settings>
            [...]
            <setting name="LatestCheckTimestamp" serializeAs="String">
                <value>02/22/2013 14:39:06 +00:00</value>
            </setting>
            [...]
        </MyApp.Properties.Settings>
    </userSettings>
</configuration>

Есть ли способ указать некоторые параметры сериализации для повышения точности?

Я знаю, что могу использовать какой-то обходной путь, например, сохраняя тики и значение смещения или что-то в этом роде, но я хотел бы знать, нет ли лучшего способа.

EDIT: дополнительная информация: я использую стандартные настройки проекта Visual Studio для хранения своего значения:

MyApp.Settings.Default.LatestCheckTimestamp = initialLatestCheckTimestamp;
MyApp.Settings.Default.Save();

MyApp.Settings — это класс, созданный Visual Studio при редактировании настроек на странице свойств проекта.

EDIT 2: Решение:

Основываясь на ответе Мэтта Джонсона, я сделал следующее:

  1. Параметр переименован с LatestCheckTimestamp на LatestCheckTimestampString, но не в моем коде
  2. Добавлена ​​следующая оболочка в независимый файл для завершения частичного класса Settings :

.

public DateTimeOffset LatestCheckTimestamp
{
    get { return DateTimeOffset.Parse(LatestCheckTimestampString); }
    set { LatestCheckTimestampString = value.ToString("o"); }
}

Новый файл конфигурации теперь выглядит так:

<configuration>
    <userSettings>
        <MyApp.Properties.Settings>
            [...]
            <setting name="LatestCheckTimestampString" serializeAs="String">
                <value>2013-02-22T16:54:04.3647473+00:00</value>
            </setting>
        </MyApp.Properties.Settings>
    </userSettings>
</configuration>

... и мой код все еще

MyApp.Settings.Default.LatestCheckTimestamp = initialLatestCheckTimestamp;
MyApp.Settings.Default.Save();

person JYL    schedule 22.02.2013    source источник
comment
Планируете ли вы поддерживать несколько пользователей Windows? Если да, то есть ли у каждого свое время последней проверки или оно общее для всех? Одна из проблем с ApplicationSettingsBase (класс, из которого получен ваш класс Settings) заключается в том, что он не позволяет записывать параметры приложения (хотя есть обходные пути).   -  person jerry    schedule 22.02.2013
comment
@jerry моя настройка ограничена пользователем. Нет проблем с этим. Спасибо за вопрос.   -  person JYL    schedule 23.02.2013


Ответы (1)


Самый надежный способ сериализации DateTimeOffset — это шаблон RoundTrip. , указанный в стандартной строке сериализации "o".

При этом используется стандарт ISO8601, обеспечивающий высокую совместимость с другими системами, языками, платформами и т. д. значение будет выглядеть так: 2013-02-22T14:39:06.0000000+00:00.

.Net будет хранить доли секунды до 7 знаков после запятой в этом формате.

Если вы можете показать некоторый код того, как вы сохраняете и извлекаете настройки своего приложения, я могу показать вам, где указать строку формата. В большинстве случаев это просто .ToString("o").

person Matt Johnson-Pint    schedule 22.02.2013
comment
Основываясь на вашем ответе, я сделал оболочку для значения, хранящегося в виде строки, вместо DateTimeOffset. Смотрите мою правку. Спасибо ! - person JYL; 22.02.2013
comment
Это кажется разумным. Я немного покопался в документах MSDN, и не похоже, что вы можете указать строку формата для настроек приложения. Это безумие, что они используют для этого формат по умолчанию, тем более что он чувствителен к культуре. Формат "o" намного безопаснее. - person Matt Johnson-Pint; 22.02.2013