2

我有一个预定义的 xml 示例,它定义了请求和响应,我无法使用的唯一部分ServiceStack.Text.XmlSerializer是以下代码片段,它基本上是一个字符串列表。

<user>
....
    <EmailPreferences> 
        <EmailProgram>Newsletter</EmailProgram> 
        <EmailProgram>Coupons</EmailProgram> 
    </EmailPreferences> 

我尝试使用示例Using Structs to customize JSON,但正如标题所暗示的那样,这并不影响 xml 序列化。

4

1 回答 1

3

ServiceStack 在底层使用 .NET 的 XML DataContractSerializer。因此,您可以使用它支持的任何自定义来装饰模型。因此,要获得类似上述内容,您可以执行以下操作:

[CollectionDataContract(Name="EmailPreferences", ItemName="EmailProgram")]
public class EmailPreferences : List<string>
{
    public EmailPreferences() { }
    public EmailPreferences(IEnumerable<string> collection) : base(collection){}
}

全局 XML 命名空间

尽管您可以为每个 DataContract 单独添加命名空间,但更好的做法是让所有 DTO 共享相同的命名空间,这将防止自动生成和重复的命名空间出现在您的 XML 中。

由于 ResponseStatus DTO 已经在http://schemas.servicestack.net/types命名空间下,所以如果你不关心你的命名空间是什么,我会把它留在那里。

将所有 DataContract 放在同一个命名空间下的最简单方法是将这些程序集范围的属性放在您的 AssemblyInfo.cs 中,以便为您的 DTO 所在的每个 C# 命名空间:

[assembly: ContractNamespace("http://schemas.servicestack.net/types",  
    ClrNamespace = "ServiceStack.Examples.ServiceModel.Operations")]
[assembly: ContractNamespace("http://schemas.servicestack.net/types",  
   ClrNamespace = "ServiceStack.Examples.ServiceModel.Types")]
于 2012-07-26T05:50:13.760 回答