假設你有定義爲WCF可以通過線路保持引用相等嗎?
[DataContract]
public class Foo
{
[DataMember]
public List<Bar> Bars {get; set;}
}
[DataContract]
public class Bar
{
[DataMember]
public string Baz { get; set; }
}
public class Service1 : IService1
{
public bool Send(Foo foo)
{
var bars = foo.Bars;
bars[0].Baz = "test2";
return bars[0].Baz == bars[1].Baz;
}
}
[ServiceContract]
public interface IService1
{
[OperationContract]
bool Send(Foo composite);
}
假設我幾節課我使用WCF與客戶端和服務器之間共享數據合同DLL到WCF,如果我這樣做了以下
static void Main(string[] args)
{
using (var client = new ServiceReference.Service1Client())
{
var bar = new Bar();
bar.Baz = "Start";
List<Bar> bars = new List<Bar>();
bars.Add(bar);
bars.Add(bar);
var foo = new Foo();
foo.Bars = bars;
Console.WriteLine(bars[0].Baz == bars[1].Baz);
bars[0].Baz = "test1";
Console.WriteLine(bars[0].Baz == bars[1].Baz);
Console.WriteLine(client.Send(foo));
Console.ReadLine();
}
}
我得到True
,True
,False
作爲我的結果,這意味着bars[0]
和bars[1]
沒有指向服務器上的同一個對象。
我做錯了什麼,或者不可能通過WCF共享引用?
我需要做什麼才能使上面的代碼使用'BinaryFormatter'? –
我不知道如何使用'BinaryFormatter'而不用自己嘗試。但是你可以 - 如果你還沒有 - 嘗試使用'BinaryMessageEncoding',這可能會保持引用的平等,但我不知道。 –
我錯了,這是行不通的,因爲WCF首先生成一條消息,然後才使用指定的序列化程序對其進行序列化。但是此時默認情況下引用已經丟失,因此使用引用保留序列化程序將無濟於事。但是仍然有一個解決方案,您可以指示WCF在構建消息時保留引用 - 請參閱更新後的答案。 –