c # TimeZoneInfo сериализация - PullRequest
       2

c # TimeZoneInfo сериализация

7 голосов
/ 09 октября 2011

У меня небольшая проблема с сериализацией объекта TimeZoneInfo.Я пытался использовать переменную TimeZoneInfo в контракте данных для службы WCF, но сериализация не удалась.Итак, я написал этот маленький кусочек кода для проверки сериализации.Вот что я делаю:

        var fileName = "tmp.xml";
        var tz = TimeZoneInfo.Local;
        var dataSer = new DataContractSerializer(typeof(TimeZoneInfo));

        try
        {
            using (var xml = new FileStream(fileName, FileMode.Create))
            {
                dataSer.WriteObject(xml, tz);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }

Теперь, когда я вызываю метод WriteObject, он выдает исключение:

Тип 'System.TimeZoneInfo + AdjustmentRule []' с именем контракта данных'ArrayOfTimeZoneInfo.AdjustmentRule: http://schemas.datacontract.org/2004/07/System' не ожидается.Рассмотрите возможность использования DataContractResolver или добавьте любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив их в список известных типов, переданных в DataContractSerializer.я пытаюсь добавить [KnownType (typeof (System.TimeZoneInfo.AdjustmentRule []))] в класс, я получаю ту же ошибку.И если я добавлю эту строку в мой интерфейс контракта данных, я получу ошибку компиляции:

Ошибка 1 «System.TimeZoneInfo.AdjustmentRule» недоступна из-за уровня защиты

И согласно документации, класс TimeZoneInfo реализует ISerializable, поэтому он должен сериализоваться по умолчанию.

Может кто-нибудь сказать мне, что я делаю здесь неправильно?Буду признателен за любую помощь.

Спасибо.

Ответы [ 3 ]

6 голосов
/ 09 октября 2011

Я не уверен, почему он не просто сериализуется, но вы рассматривали просто сериализацию ID ? Это, вероятно, будет более эффективным - и проще! - чем сериализовать всю информацию внутри, и все должно быть хорошо, если обе системы имеют этот часовой пояс.

РЕДАКТИРОВАТЬ: обратите внимание, что это не будет работать с пользовательскими часовыми поясами, для которых вы должны смотреть на ToSerializedString, как отмечено в другом месте.

1 голос
/ 10 октября 2011

Я тоже не уверен, почему. Как предположил Джон, прокси-свойство с идентификатором - это, вероятно, правильный путь.

В качестве альтернативы, если вам действительно нужно передавать содержимое TimeZoneInfo и поддерживать настраиваемые зоны, вам следует использовать свойство прокси, которое охватывает ToSerializedString() и FromSerializedString().

0 голосов
/ 10 декабря 2012

Похоже, что TimeZoneInfo не очень хорошо работает с WCF из коробки.Обходной путь можно найти здесь:

http://social.msdn.microsoft.com/Forums/en/wcf/thread/f164f185-ae18-4775-a2ff-a814813d262d

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...