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

Ваша конфигурация правильно устанавливает версию API по умолчанию, если она не указана. Но ваши маршруты требуют, чтобы URL запроса включал v{version} часть. Поэтому одно из возможных решений - добавить еще один маршрут без v{version}, например,

[ApiController]
[Route("v{version:apiVersion}/[controller]")]
[Route("/[controller]")]
[ApiVersion("1.0")]
public class UsersController : ControllerBase
{
    [HttpGet("log")]
    public string Get()
    {
        return $"{DateTime.Now}";
    }
}

. Теперь запрос к http://localhost:5000/users/log будет указывать на контроллер с версией API 1.0. Если вы добавите этот маршрут ко второму контроллеру, версия 1.0 все равно будет выбрана, потому что будет выбрано значение по умолчанию ApiVersion и будет 1.0.

7
задан Jonathan Parker 3 March 2009 в 06:07
поделиться

3 ответа

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

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

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

5
ответ дан 7 December 2019 в 07:50
поделиться

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

Я думаю, что Вы застреваете с 1 из 2 опций

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

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

1
ответ дан 7 December 2019 в 07:50
поделиться

Я просто запустил немного теста, с помощью Сервиса 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] или [сериализуемый]. Интересно, этому, кажется, не нужен конструктор по умолчанию на стороне клиента. Здесь существует связанное сообщение:

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

1
ответ дан 7 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: