Сериализация структурных объектов веб-сервисами - PullRequest
2 голосов
/ 10 февраля 2009

Я «расширил» структуру System.DateTime, добавив в нее некоторые необходимые поля. В идеале я хотел бы иметь возможность доставить этот объект через веб-сервис клиенту winforms.

Я пометил тип stuct как [Serializable], и он также подразумевает ISerializable, однако, если я проверяю XML, доставляемый веб-сервисом, он просто содержит пустой тег для объекта.

Размещение точек останова повсюду привело меня к мысли, что когда объект обезвоживается, метод ISerializable void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) никогда не вызывается.

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

Кто-нибудь знает, почему GetObjectData игнорируется платформой .net при подготовке данных для ответа веб-службы? Структура, с которой я работаю, содержит член DateTime и несколько логических значений.

обратите внимание, это .net 2.0!

Приветствия

1 Ответ

2 голосов
/ 10 февраля 2009

Во-первых, веб-сервисы используют XmlSerializer - поэтому вам нужно IXmlSerializable для настраиваемой сериализации. Стандартная сериализация XmlSerializer действует только на общедоступные свойства, которые имеют как геттер, так и сеттер.

Во-вторых, структуры обычно работают не очень хорошо, как объекты DTO веб-службы; в частности, XmlSerializer требует, чтобы все было изменчиво ... чего не должно быть.

Лично я бы использовал класс. Если вы можете дать больше информации, я мог бы сказать больше ...

Например:

[Serializable]
public class FunkyTime
{
    [XmlAttribute]
    public DateTime When { get; set; }
    [XmlAttribute]
    public bool IsStart { get; set; }
    [XmlAttribute]
    public bool IsEnd { get; set; }
}

(обратите внимание, что вы можете настроить макет / имена XML различными способами)

...