2012-04-06 5 views
1

Ich habe eine Schnittstelle und eine Implementierung, beide mit [ProtoContract]. Es gibt eine Eigenschaft, die in der Schnittstelle schreibgeschützt ist. Wenn ich versuche, eine Eigenschaft als Schnittstelle deklariert deserialisieren, gibt Protobuf mir diesen Fehler:Kann ich auf eine schreibgeschützte Eigenschaft einer Schnittstelle in protobuf-net deserialisieren?

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

Hier ist der Code, den ich mit dem Testen bin:

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; } 
    } 

Ich würde lieber nicht erklären Setter auf der Schnittstelle, und ich würde gerne die TheFoo Eigenschaft als IFoo erklärt, wenn überhaupt möglich. Gibt es einen Weg, der zur Arbeit gebracht werden kann? Ich benutze Protobuf-Net v2.

+0

Nein, Sie können nicht, das Objekt ist konstruiert und damit die Chance, Ihr privates Set zu verwenden. – Landern

Antwort

4

Nein. Beim Binden an eine Schnittstelle bindet es sich an die Schnittstelle, sodass es keine privaten Setter (usw.) ausnutzen kann, die beim Binden an den konkreten Typ verfügbar wären. Die einzige Möglichkeit wäre, die Mitglieder von Foo für die Serialisierung anstelle von IFoo zu werben.

Hinweis: in Nicht-Schnittstellen-Szenarien wird es Zugriff auf die Mitglieder haben, oder sogar das direkte Feld der gewünschten.

Verwandte Themen