我正在实现一个lo-REST API并希望返回XML或JSON。在.NET WCF中构建它。
我喜欢Flickr和Last FM API的设计,它们将变量复杂类型包装在一个简单的响应中:
<lfm status="ok">
<user>
<name>RJ</name>
<realname>Richard Jones </realname>
<country>UK</country>
<age>27</age>
</user>
</lfm>
或
<lfm status="ok">
<track>
<name>Best track ever</name>
<album>Thriller</album>
</user>
</lfm>
或
<lfm status="fail">
... error details
</lfm>
复杂类型的序列化很简单,正如您所期望的那样(使用DataContract,DataMember等)。但是由于可能包含在内部的可变复杂类型,将它包装在某种自定义响应中会让我感到沮丧。给响应提供由复杂类型填充的类型对象的成员不会序列化:
[DataContract]
public class Response
{
public enum ResponseStatus
{
ok,
fail
}
[DataMember]
public ResponseStatus Status { get; set; }
[DataMember]
public object Data { get; set; }
}
非常感谢任何想法或帮助。
非常感谢, 亚历
修改 蒂姆罗伯茨提供了一个有趣的解决方案,虽然它没有很好地序列化。一个选项是将所有可能的复杂类型作为属性指定[DataMember(EmitDefaultValue = false)],因此空值不会序列化。不确定这是最好的解决方案。
答案 0 :(得分:1)
您可以在Data
中为Response
类型定义类层次结构:
如,
[DataContract]
public abstract class Data
{ }
[DataContract]
public class FooData : Data
{ }
[DataContract]
public class BarData : Data
{ }
然后在Response
类上指出已知类型:
[DataContract]
[KnownType(typeof(FooData))]
[KnownType(typeof(BarData))]
public class Response
{
public enum ResponseStatus
{
ok,
fail
}
[DataMember]
public ResponseStatus Status { get; set; }
[DataMember]
public Data Data { get; set; }
}