2013-12-19 45 views
0

這是我第一次做的代碼(這是不工作),我的問題將遵循代碼。Wcf序列化/反序列化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對象並由操作合同返回時?我只是在這裏尋找解釋,因爲我已經解決了我的問題。

(您可以隨時關閉它,如果它不屬於這裏......)

回答

0

如果我理解正確的話,你在服務器上修改列表,您希望您可以閱讀的這些變化客戶端。您需要將參數指定爲ref。這樣,在服務器上所做的更改將返回給客戶端。否則他們不會,你只會在客戶端看到你最初放在列表中的東西,所以在你的情況下它將是空的。 IE瀏覽器。

void Validate(ref Parameters parameters); 
+0

謝謝,就是這樣。 – Fid