2012-04-06 24 views
1

我有一個接口和一個實現,都與[ProtoContract]。有一個屬性,它在接口上是隻讀的。當我嘗試反序列化聲明爲接口的屬性,的Protobuf給了我這個錯誤:可以反序列化爲protobuf-net中接口的只讀屬性嗎?

System.InvalidOperationException: Cannot apply changes to property IFoo.Id

這裏是我與測試代碼:

public void Main() 
    { 
     using (var ms = new MemoryStream()) 
     { 
      var x = new HasFoo {TheFoo = new Foo(1)}; 

      Serializer.Serialize(ms, x); 
      ms.Position = 0; 
      var clone = Serializer.Deserialize<HasFoo>(ms); 

      Assert.AreEqual(1, clone.TheFoo.Id); 
     } 
    } 


    [ProtoContract, ProtoInclude(100, typeof(Foo))] 
    public interface IFoo 
    { 
     [ProtoMember(1)] 
     long Id { get; } 
    } 

    [ProtoContract] 
    public class Foo : IFoo 
    { 
     [ProtoMember(1)] 
     public long Id { get; private set; } 

     public Foo() { } 

     public Foo(long id) 
     { 
      Id = id; 
     } 
    } 

    [ProtoContract] 
    public class HasFoo 
    { 
     [ProtoMember(1)] 
     public IFoo TheFoo { get; set; } 
    } 

我寧願不聲明如果可能的話,我想保留TheFoo屬性聲明爲IFoo。有什麼辦法可以發揮作用嗎?我正在使用protobuf-net v2。

+0

不,你不能,對象被構造,從而失去了使用你的私人設置的機會。 – Landern 2012-04-06 16:23:58

回答

4

否。當綁定到一個接口時,它綁定到接口,所以它不能利用綁定到具體類型時可用的任何私有setter(等)。你可以做到這一點的唯一方法是宣傳Foo的序列化成員而不是IFoo。

注意:在非界面場景中,它將有權訪問成員,甚至是所需的直接字段。

相關問題