Возможно ли сериализовать объекты без конструктора без параметров в WCF?
-
03-07-2019 - |
Вопрос
Я знаю, что работает частный конструктор без параметров, но как насчет объекта без конструкторов без параметров?
Я хотел бы предоставлять типы из сторонней библиотеки, поэтому у меня нет контроля над определениями типов.
Если есть способ, какой самый простой?Например.Я не знаю, что нужно для создания подтипа.
Редактировать:
То, что я ищу, - это что-то вроде уровня настройки, показанного здесь: http://msdn.microsoft.com/en-us/magazine/cc163902.aspx хотя я не хочу прибегать к потокам для сериализации / десериализации.
Решение
На самом деле вы не можете сделать произвольные типы сериализуемыми;в некоторых случаях (XmlSerializer
, например) среда выполнения предоставляет опции для подмены атрибутов.Но DataContractSerializer
этого нельзя допустить.Возможные варианты:
- спрячьте классы за вашими собственными типами, которые являются сериализуемый (много работы)
- предоставлять суррогаты двоичного форматирования (yeuch)
- напишите свое собственное ядро сериализации (потребуется много работы, чтобы разобраться в этом).
По сути, если что-то не является разработанный для сериализации очень небольшая часть фреймворка будет пусть вы сериализуете его.
Другие советы
Я не эксперт по WCF, но маловероятно, что они поддерживают сериализацию в конструкторе с произвольными типами.А именно потому, что что бы они передали в качестве значений?Вы могли бы передать null для ссылочных типов и пустые значения для структур.Но что хорошего было бы в типе, который можно было бы создать с полностью пустыми данными?
Я думаю, вы застряли с 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 создаются экземпляры объектов без вызова конструктора?