簡體   English   中英

WCF序列化/反序列化List <>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM