我有一种方法可以正确序列化 DTO 中的结构,或者更好地让框架以某种方式将结构视为 dto。
我已被告知 JsConfig.TreatValueAsRefTypes 值,但这仅适用于 json,对吗?xml、soap、mq 等呢?
另一方面,我也无法弄清楚我在使用 JsConfig.TreatValueAsRefTypes 时做错了什么,编译器似乎认为它是在静态上下文中调用的:非静态字段需要对象引用,方法......
我有一种方法可以正确序列化 DTO 中的结构,或者更好地让框架以某种方式将结构视为 dto。
我已被告知 JsConfig.TreatValueAsRefTypes 值,但这仅适用于 json,对吗?xml、soap、mq 等呢?
另一方面,我也无法弄清楚我在使用 JsConfig.TreatValueAsRefTypes 时做错了什么,编译器似乎认为它是在静态上下文中调用的:非静态字段需要对象引用,方法......
我刚刚提交了一个更改(在下一个版本中可用),它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));