2012-11-13 148 views
1

我使用的数据合同序列化序列化XML中的下列类的数据契约序列化:复杂类型

[DataContract] 
public partial class Foo 
{ 
    [DataMember] 
    public string MyString { get; set; } 
    [DataMember] 
    public int MyInt { get; set; } 
    [DataMember] 
    public Bar MyBar { get; set; } 
} 

[DataContract] 
public class Bar 
{ 
    public int BarId { get; set; } 
    [DataMember] 
    public string BarField { get; set; } 
} 

当我序列化它会产生这样的XML:

<Foo> 
    <MyString>My text</MyString> 
    <MyInt>2</MyInt> 
    <MyBar> 
     <BarField>My bar field</BarField> 
    </MyBar> 
</Foo> 

我会喜欢做的是让MyBar字段不会显示为复杂类型,而是像这样代替:

<Foo> 
    <MyString>My text</MyString> 
    <MyInt>2</MyInt> 
    <MyBar>My bar field</MyBar> 
</Foo> 

我是数据协定序列化的新手,并没有找到任何解决我的问题的教程。我甚至不知道这是否可行,但我想我会问,之前我放弃和处理它的方式,或找到了一个更好的解决方案。

回答

3

通过装饰数据类为DataContract,您固有地设置了数据将在序列化时表示的结构(Xml,Json等)。

我可以建议您将“业务实体”和“序列化实体”的关注点从数据类中分离出来,例如:如果Foo + Bar是你的数据的存储或ORM交涉,然后从他们身上取出[DataContract] S:

public partial class Foo 
{ 
    public string MyString { get; set; } 
    public int MyInt { get; set; } 
    public Bar MyBar { get; set; } 
} 

public class Bar 
{ 
    public string BarField { get; set; } 
} 

然后,针对序列化格式提供了一类新具体地说,饰以DataContract

[DataContract] 
public partial class SerializableFoo 
{ 
    [DataMember] 
    public string MyString { get; set; } 
    [DataMember] 
    public int MyInt { get; set; } 
    [DataMember] 
    public string MyBar { get; set; } 
} 

然后提供一个映射函数来映射从一个到另一个。对于这类工作,LINQ非常棒,而且如果这些类大多具有相同的属性名称,那么AutoMapper可以为您做很多工作,例如

var wireFoo = new SerializableFoo() 
{ 
    MyString = foo.MyString, 
    MyInt = foo.MyInt, 
    MyBar = foo.Bar.BarField // Do the projection/flattening here 
} 
// Serialize wireFoo here, or return it from a WCF Service, etc. 
2

您正在将其定义为一个复杂的类型...这意味着它将通过这样的方式来实现。如果您不希望这样做,那么更改Foo的数据合同以将Bar作为字符串,而不是复杂类型。

从XML的角度来看,基本上,您将类定义为DataContract,将属性定义为DataMembers,您正在创建复杂对象或包含元素的元素。在你提交的情况下,你会改变你的第一份数据合约,以便它不包含额外的复杂对象,只包含你想要的数据。

但是,在这些SOA情况下应用OO设计时,取决于您想要实现的目标,其他复杂对象内部的复杂对象比处理大量复杂对象更容易处理甚至读取属性。

为了得到你的结果,你可以放弃你的Bar类,并且只需要在Foo中返回一个字符串。

[DataContract] 
public partial class Foo 
{ 
    [DataMember] 
    public string MyString { get; set; } 
    [DataMember] 
    public int MyInt { get; set; } 
    [DataMember] 
    public string MyBar { get; set; } 
} 

编辑:我想我是没有答案,这是NO你想要什么,你不能获得并保持你的复杂类型不够清楚。您的XML将根据您的OO设计进行结构化。

+0

谢谢你的回答,但那不是我问的。我问是否可以在保持复杂类型的同时完成我想要的功能。如果你的解决方案只是抛弃复杂的类型,并把它做成一个字符串,那么你应该告诉我不。如果我的情况和我给出的例子一样简单,那会很好。不幸的是,它不是。 – jebar8

+0

答案是否定的 – iMortalitySX