繁体   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