2016-11-24 1 views
1

Ich habe einen Cache von Sammlung von System.Globalization.CultureInfo Klasse in meinem Kontext Wrapper-KlasseTyp ist nicht zu erwarten, und kein Vertrag mit .NET vordefinierten Klasse mit protobuf-net

public Collection<System.Globalization.CultureInfo> Cultures 
{ 
    get 
    { 
     // Get the value from Redis cache 
    } 
    set 
    { 
     // Save the value into Redis cache 
    } 
} 

Es kann über zugegriffen wird geschlossen werden MyContextWrapper.Current.Cultures.

Ich erhalte den folgenden Fehler, während der Wert von „Collection Kulturen“ mit protobuf-net Serialisierung:

Typ ist nicht zu erwarten, und kein Vertrag kann abgeleitet werden: System.Globalization.CultureInfo

enter image description here

Ich bin mir bewusst, dass protobuf-net [ProtoContract] und [ProtoMember] Dekoration für die Klasse benötigt, aber das ist nur für benutzerdefinierte benutzerdefinierte Klassen möglich.

Wie kann ich mit .NET vordefinierte Klasse dann zum Beispiel System.Globalization.CultureInfo in meinem Fall gehen.

Ist das überhaupt möglich mit protobuf-net?

+0

Warum serialisieren Sie Kulturinformationen? – Maarten

+0

Hat meine Antwort Ihnen geholfen? Lass es mich wissen, wenn ich etwas hinzufügen soll. – Measuring

Antwort

1

Sie könnten mit einem Ersatz gehen. Benachrichtigen Sie protobuf-net darüber, bevor Sie die Sammlung serialisieren. Obwohl das, was ich jetzt habe, nur mit den eingebauten Kulturen funktioniert, können Sie es selbst erweitern, um zusätzliche Daten hinzuzufügen, um die Kultur vollständig wiederherzustellen.

Beispiel

Das Surrogat Culture in eine protobuf-net unterstützten Typ zu konvertieren.

[ProtoContract] 
public class CultureInfoSurrogate 
{ 
    [ProtoMember(1)] 
    public int CultureId { get; set; } 

    public static implicit operator CultureInfoSurrogate(CultureInfo culture) 
    { 
     if (culture == null) return null; 
     var obj = new CultureInfoSurrogate(); 
     obj.CultureId = culture.LCID; 
     return obj; 
    } 

    public static implicit operator CultureInfo(CultureInfoSurrogate surrogate) 
    { 
     if (surrogate == null) return null; 
     return new CultureInfo(surrogate.CultureId); 
    } 
} 

Diesen irgendwo am Anfang des Programms (zumindest, bevor Sie der Sammlung sind die Serialisierung):

RuntimeTypeModel.Default.Add(typeof(CultureInfo), false).SetSurrogate(typeof(CultureInfoSurrogate)); 

Wenn Sie weitere Fragen haben, lassen Sie mich in den Kommentaren wissen.

Verwandte Themen