2011-03-10 31 views
0

因此,我试图为我创建的API的使用者创建特定的XML格式。实际上,你会像这样一个模型:复杂的XML序列化问题

public class SampleModel 
{ 
    public ErrorCodeEnum ErrorCode { get; set; } 
    public List<Error> LocalizedErrors { get; set; } 
    public object AdditionalInformation { get; set; } 
} 

现在可以说我有一个样品模型,像这样:

SampleModel model = new SampleModel() 
model.ErrorCode = ErrorCodeEnum.InvalidParameters; 
model.LocalizedErrors = new List<Error> 
{ 
    new Error { For = "SomeField", Message = "Your SomeField value is unacceptable." }, 
    new Error { For = "SomeField2", Message = "Your SomeField2 value is unacceptable." }, 
}; 
model.AdditionalInformation = new SomeOtherType { SomeProperty = "Whatever" }; 

我想确保序列化到这样的事情:

<xml> 
<SampleModel> 
    <ErrorCode>InvalidParameters</ErrorCode> 
    <Errors> 
     <Error For="Somefield">Your SomeField value is unacceptable.</Error> 
     <Error For="Somefield2">Your SomeField2 value is unacceptable.</Error> 
    </Errors> 
    <SomeProperty>Whatever</SomeProperty> 
</SampleModel> 

我已经解决了相当多的这个问题,但仍然存在一个问题。基本上,现在,这一切都序列化了,像这样:

<xml> 
<SampleModel> 
    <ErrorCode>InvalidParameters</ErrorCode> 
    <Errors> 
     <Error For="Somefield">Your SomeField value is unacceptable.</Error> 
     <Error For="Somefield2">Your SomeField2 value is unacceptable.</Error> 
    </Errors> 
    <AdditionalInformation> 
     <SomeProperty>Whatever</SomeProperty> 
    </AdditionalInformation> 
</SampleModel> 

默认的XmlSerializer的输出特性(在这种情况下AdditionalInformation)周围的序列化的节点是值的名称。我一直在尝试多种方式来摆脱这个节点。我想看到的基本上是我的值字典,它被附加在XML根的1个子级深处,并且摆脱了AdditionalInformation。所以,如果我有像这样的模型:

SampleModel model = new SampleModel() 
model.ErrorCode = ErrorCodeEnum.InvalidParameters; 
model.LocalizedErrors = new List<Error> 
{ 
    new Error { For = "SomeField", Message = "Your SomeField value is unacceptable." }, 
    new Error { For = "SomeField2", Message = "Your SomeField2 value is unacceptable." }, 
}; 
model.AdditionalInformation = new AThirdType { Foo = "Bar", Bing = "Baz" }; 

我会得到下面的XML:

<xml> 
<SampleModel> 
    <ErrorCode>InvalidParameters</ErrorCode> 
    <Errors> 
     <Error For="Somefield">Your SomeField value is unacceptable.</Error> 
     <Error For="Somefield2">Your SomeField2 value is unacceptable.</Error> 
    </Errors> 
    <Foo>Bar</Foo> 
    <Bing>Baz</Bing> 
</SampleModel> 

这是可能的,而无需通过我自己能做的XmlSerializer /解串器的精力去?

回答

3

如果没有实现一些自定义序列化机制(如IXmlSerializable),恐怕这是不可能的,因为想象你有这个XML,并且你想要将它反序列化回模型。序列化程序不可能知道这些属性属于复杂对象。

您可以调整的另一个策略是简单地创建一个视图模型类,它将根据所需的XML结果进行调整,然后使用AutoMapper将模型映射并平铺到此视图模型。

另一种可能性是直接使用XDocument编写自定义序列化机制。

+0

我认为今天我们将详细讨论这个问题后,我们将在XML序列化方面采取不同的方向;然而,这些建议很有帮助。标记为已回答。 – Tejs 2011-03-10 20:22:56