[英]Wcf serialization/deserialization of List<>
這是我首先執行的代碼(不起作用),我的問題將跟隨代碼。
[DataContract]
public class ValidationData
{
[DataMember]
public bool IsValid { get; set; }
[DataMember]
public List<string> Messages { get; set; }
}
[DataContract]
public class Parameters
{
[DataMember]
public string Name { get; set; }
[DataMember]
public ValidationData ValidationData { get; set; }
}
[ServiceContract]
public interface IValidation
{
[OperationContract]
void Validate(Parameters parameters);
}
public class Validation : IValidation
{
public void Validate(Parameters parameters)
{
bool valid = someClass.DoValidation(parameters.Name);
parameters.ValidationData.IsValid = valid;
if(!valid)
parameters.ValidationData.Messages.Add("some validation message");
}
}
在客戶端,我這樣調用服務:
var service = new WcfService.ValidationService();
var parameters = new WcfService.Parameters();
parameters.Name = "some name to validate";
parameters.ValidationData = new WcfService.ValidationData();
parameters.ValidationData.Messages = new List<string>();
service.SynchronizeDatabase(parameters);
if(!parameters.ValidationData.IsValid)
ShowMessage(string.join(Environnement.NewLine, parameters.ValidationData.Messages));
使用該代碼,當我在客戶端上查看parameters.ValidationData
時,我具有很好的IsValid
字段值,但是無論IsValid
的值如何,列表始終為空。
我知道這不是最好的方法,這就是為什么我更改了它。 現在它正在工作,服務合同如下所示:
[ServiceContract]
public interface IValidation
{
[OperationContract]
ValidationData Validate(Parameters parameters); // changed void to ValidationData
}
現在參數數據合約為:
[DataContract]
public class Parameters // Removed the ValidationData member
{
[DataMember]
public string Name { get; set; }
}
最后執行運營合同:
public class Validation : IValidation
{
public ValidationData Validate(Parameters parameters)
{
var validations = new ValidationData(); // in the constructor I initialize the list
validations.IsValid = someClass.DoValidation(parameters.Name);
if(!validations.IsValid)
validations.Messages.Add("some validation message");
return validations;
}
}
我的問題是,如果列表包含在客戶端發送的參數列表中,為什么列表始終為空(我這樣做的第一種方式)。 而且不是在服務器端創建ValidationData對象並由操作合同將其返回時嗎? 我已經在解決問題了,所以我只是在這里尋求解釋。
(如果它不屬於這里,請隨時關閉它...)
如果我理解正確,那么您正在修改服務器上的列表,並且希望您可以在客戶端讀取這些更改。 您需要將參數指定為ref
。 這樣,在服務器上所做的更改將返回給客戶端。 否則,它們將不會,您只會在客戶端看到最初放入列表的內容,因此在您的情況下將為空。 就是
void Validate(ref Parameters parameters);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.