我试图让 ServiceStack 将对象列表返回给 C# 客户端,但我不断收到此异常:
"... System.Runtime.Serialization.SerializationException: Type definitions should start with a '{' ...."
我试图返回的模型:
public class ServiceCallModel
{
public ServiceCallModel()
{
call_uid = 0;
}
public ServiceCallModel(int callUid)
{
this.call_uid = callUid;
}
public int call_uid { get; set; }
public int store_uid { get; set; }
...... <many more properties> ......
public bool cap_expense { get; set; }
public bool is_new { get; set; }
// An array of properties to exclude from property building
public string[] excludedProperties = { "" };
}
响应:
public class ServiceCallResponse
{
public List<ServiceCallModel> Result { get; set; }
public ResponseStatus ResponseStatus { get; set; } //Where Exceptions get auto-serialized
}
和服务:
public class ServiceCallsService : Service
{
// An instance of model factory
ModelFactory MyModelFactory = new ModelFactory();
public object Any(ServiceCallModel request)
{
if (request.call_uid != 0)
{
return MyModelFactory.GetServiceCalls(request.call_uid);
} else {
return MyModelFactory.GetServiceCalls() ;
}
}
}
客户端通过以下方式访问服务:
JsonServiceClient client = new ServiceStack.ServiceClient.Web.JsonServiceClient("http://172.16.0.15/");
client.SetCredentials("user", "1234");
client.AlwaysSendBasicAuthHeader = true;
ServiceCallResponse response = client.Get<ServiceCallResponse>("/sc");
“模型工厂”类是一个返回列表的数据库访问类。当我通过网络浏览器访问该服务时,一切似乎都运行良好。从服务返回的 JSON 启动:
"[{"call_uid":70...."
并以:
"....false,"is_new":true}]"
我的问题是,这里可能导致序列化/反序列化失败的原因是什么?
解决方案
感谢mythz的回答,我能够弄清楚我做错了什么。我的误解在于到底有多少 DTO 类型以及它们的作用。在我看来,我让它们以某种不正确的方式合并在一起。所以现在据我了解:
要返回的对象(在我的例子中,称为“ServiceCallModel”:ServiceStack 完成工作后您希望客户端拥有的实际类。在我的例子中,ServiceCallModel 是我的程序中的一个关键类,许多其他类都使用和创建它。
请求 DTO:这是客户端发送到服务器的内容,包含与发出请求相关的任何内容。变量等
响应 DTO:服务器发送回请求客户端的响应。这包含一个数据对象(ServiceCallModel),或者在我的例子中...... ServiceCallModel 的列表。
此外,正如 Mythz 所说,我现在明白在请求 DTO 中添加“IReturn”的原因是,客户端将准确地知道服务器将发送回它的内容。在我的例子中,我使用 ServiceCallModel 列表作为 Android 中 ListView 的数据源。所以很高兴能够告诉 ListViewAdapter “response.Result”实际上已经是一个有用的列表。
感谢神话的帮助。