Структуры значений в DTO в ServiceStack

У меня есть способ получить правильную сериализацию структур в DTO или, что еще лучше, если фреймворк как-то трактует структуры как dto.

Я был проинформирован о значении JsConfig.TreatValueAsRefTypes, но это будет работать только для json, я прав? что насчет xml, soap, mq и т. д. Я просто хочу использовать структуры, которые у меня есть, и мне не нужно отображать их в dto, что для моего проекта заняло бы годы...

С другой стороны, я также не могу понять, что я делаю неправильно с JsConfig.TreatValueAsRefTypes, кажется, что компилятор считает, что он вызывается в статическом контексте: ссылка на объект требуется для нестатического поля, метода...

1 ответ

Решение

Я только что совершил изменение (доступно в следующем выпуске), которое делает JsConfig<T>.TreatValueAsRefType как статические, так что теперь вы можете сериализовать типы структуры как ссылочный тип, например:

public struct UserStruct
{
    public int Id { get; set; }
    public string Name { get; set; }
}

JsConfig<UserStruct>.TreatValueAsRefType = true;

var dto = new UserStruct { Id = 1, Name = "foo" };

dto.ToJson().Print(); //= {"Id":1,"Name":"foo"}

dto.ToJsv().Print();  //= {Id:1,Name:foo}

dto.ToXml().Print(); 

ServiceStack использует.NET XML DataContractSerializer (который также используется в SOAP), который уже сериализует структуры, как ожидается, с:

<?xml version="1.0" encoding="utf-8"?>
<UserStruct xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns="http://schemas.datacontract.org/2004/07/ServiceStack.Text.Tests">
    <Id>1</Id>
    <Name>foo</Name>
</UserStruct>

Вы также можете использовать статический API для регистрации структурных типов, используя неуниверсальный API:

JsConfig.TreatValueAsRefTypes.Add(typeof(UserStruct));
Другие вопросы по тегам