2013-10-03 4 views
5

Mit Protobuf-Net v2 Build 668, versuche ich eine Klasse zu serialisieren/deserialisieren, die ein Mitglied definiert als ein enthält Schnittstelle während der On-The-Fly-Konvertierung zur gleichen Zeit. Normalerweise würde der Ersatzansatz funktionieren, aber da C# keine benutzerdefinierten Konvertierungen für Schnittstellen zulässt, kann ich die Konvertierungen nicht definieren.Gibt es eine Möglichkeit, alternative Konvertierungsfunktionen (von/zu Schnittstellen) in einer protobuf-net Ersatzklasse zu definieren

Danke,

namespace ProtoBufNetTest 
{ 
    using System.Diagnostics; 
    using System.IO; 

    using ProtoBuf; 
    using ProtoBuf.Meta; 

    class Program 
    { 
     static void Main() 
     { 
      RuntimeTypeModel.Default.Add(typeof(IDummy), false) 
       .SetSurrogate(typeof(DummySurrogate)); 

      var container = new Container { Data = new Dummy { Positive = 3 } }; 

      using (var file = File.Create("test.bin")) 
      { 
       Serializer.Serialize(file, container); 
      } 

      using (var file = File.OpenRead("test.bin")) 
      { 
       container = Serializer.Deserialize<Container>(file); 
       Debug.Assert(container.Data.Positive == 3); 
      } 
     } 
    } 

    // Outside of the project, cannot be changed 
    public interface IDummy 
    { 
     int Positive { get; set; } 
    } 

    [ProtoContract] 
    public class Container 
    { 
     [ProtoMember(1)] 
     public IDummy Data { get; set; } 
    } 

    public class Dummy : IDummy 
    { 
     public int Positive { get; set; } 
    } 

    [ProtoContract] 
    class DummySurrogate 
    { 
     [ProtoMember(1)] 
     public int Negative { get; set; } 

     // Does not compile : user-defined conversions to or from an interface are not allowed 
     public static explicit operator IDummy(DummySurrogate value) 
     { 
      return value == null ? null : new Dummy { Positive = -value.Negative }; 
     } 

     // Does not compile : user-defined conversions to or from an interface are not allowed 
     public static explicit operator DummySurrogate(IDummy value) 
     { 
      return value == null ? null : new DummySurrogate { Negative = -value.Positive }; 
     } 

     // Fake attribute, does not exist but could work if it did 
     [ProtoConvertFrom] 
     public static IDummy From(DummySurrogate value) 
     { 
      return value == null ? null : new Dummy { Positive = -value.Negative }; 
     } 

     // Fake attribute, does not exist but could work if it did 
     [ProtoConvertTo] 
     public static DummySurrogate To(IDummy value) 
     { 
      return value == null ? null : new DummySurrogate { Negative = -value.Positive }; 
     } 
    } 
} 
+0

Nur um zu sagen: Ich ignoriere dich nicht - aufgrund eines Hauszuges habe ich heute eine begrenzte PC-Zeit. Wir melden uns umgehend bei Ihnen. –

+0

Danke Marc. Viel Glück mit dem Umzug. –

Antwort

3

Im aktuellen Build: Nein, gibt es nicht.

jedoch in der nächsten Build funktioniert dies gut:

[ProtoContract] 
class DummySurrogate 
{ 
    [ProtoMember(1)] 
    public int Negative { get; set; } 

    [ProtoConverter] 
    public static IDummy From(DummySurrogate value) 
    { 
     return value == null ? null : new Dummy { Positive = -value.Negative }; 
    } 

    [ProtoConverter] 
    public static DummySurrogate To(IDummy value) 
    { 
     return value == null ? null : new DummySurrogate 
      { Negative = -value.Positive }; 
    } 
} 

Grundsätzlich ist eine static Methode markiert [ProtoConverter] hat Vorrang vor einem implicit oder explicit Umwandlungsoperator, der definiert ist, mit dem weiteren Vorteile, dass [ProtoConverter] Methoden unterliegt nicht den gleichen syntaktischen Regeln wie Operatoren. Es ist nicht erforderlich, separate *To/*From Attribute zu definieren, da die Absicht aus der Signatur hervorgeht.

Als eine Randnotiz: die Attribute auf Dummy sind unnötig und werden nie verwendet.

+0

Das ist perfekt. Ich freue mich auf den nächsten Build. Danke vielmals. Franck –

+0

Ich habe die Attribute auf Dummy entfernt, um jede Verwirrung zu vermeiden. –

+0

Marc, es scheint, dass dieser Build noch nie für NuGet freigegeben wurde. Gibt es Pläne dafür oder sollte ich protobuf-net von der Quelle erstellen? –

Verwandte Themen