Можно ли сериализовать объекты без конструктора без параметров в WCF? - PullRequest
6 голосов
/ 03 марта 2009

Я знаю, что частный конструктор без параметров работает, но как насчет объекта без конструкторов без параметров?

Я хотел бы предоставлять типы из сторонней библиотеки, чтобы не иметь контроля над определениями типов.

Если есть способ, какой самый простой? Например. Мне не нужно создавать подтип.

Edit:

То, что я ищу, это что-то вроде уровня настройки, показанного здесь: http://msdn.microsoft.com/en-us/magazine/cc163902.aspx хотя я не хочу прибегать к потокам для сериализации / десериализации.

Ответы [ 3 ]

5 голосов
/ 03 марта 2009

Вы не можете сделать сериализуемые произвольные типы; в некоторых случаях (например, XmlSerializer) среда выполнения предоставляет опции для подделки атрибутов. Но DataContractSerializer этого не позволяет. Возможные варианты:

  • скрыть классы ваших собственных типов, которые сериализуемы (много работы)
  • предоставить двоичные суррогаты форматирования (да)
  • написать свое собственное ядро ​​сериализации (много работы, чтобы разобраться)

По сути, если что-то не разработано для сериализации, очень мало фреймворка позволит вам сериализовать это.

1 голос
/ 03 марта 2009

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

//[DataContract]
//[Serializable]
public class MyObject
{
    public MyObject(string _name)
    {
        Name = _name;
    }

    //[DataMember]
    public string Name { get; set; }

    //[DataMember]
    public string Address { get; set; }
}

Вот как выглядит сервис:

public class MyService : IMyService
{
    #region IMyService Members

    public MyObject GetByName(string _name)
    {
        return new MyObject(_name) { Address = "Test Address" };
    }

    #endregion
}

Это действительно работает, если MyObject является [DataContract] или [Serializable]. Интересно, что он не нуждается в конструкторе по умолчанию на стороне клиента. Здесь есть соответствующий пост:

Как десериализация WCF создает объекты без вызова конструктора?

1 голос
/ 03 марта 2009

Я не эксперт WCF, но вряд ли они поддерживают сериализацию в конструкторе с произвольными типами. А именно потому, что они передали бы для ценностей? Вы можете передать null для ссылочных типов и пустые значения для структур. Но что хорошего в типе, который может быть создан с полностью пустыми данными?

Я думаю, что вы застряли с 1 из 2 вариантов

  1. Подкласс рассматриваемого типа и передача соответствующих значений по умолчанию конструктору без параметров
  2. Создать тип, который существует только для сериализации. После завершения он может создать экземпляр оригинального типа, который вас интересует. Это своего рода мост.

Лично я бы пошел на # 2. Сделайте класс структурой данных и оптимизируйте его для сериализации и фабричных целей.

...