Возможно ли сериализовать объекты без конструктора без параметров в WCF?

StackOverflow https://stackoverflow.com/questions/604974

Вопрос

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

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

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

Редактировать:

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

Я только что провел небольшой тест, используя службу 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 создаются экземпляры объектов без вызова конструктора?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top