2016-11-24 13 views
1

私はそれが介してアクセスすることができますタイプが期待されず、契約は

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

私のコンテキストラッパークラスにSystem.Globalization.CultureInfoクラスのコレクションのキャッシュを持っているProtobufネットで.NETあらかじめ定義されたクラスで推論することはできませんMyContextWrapper.Current.Cultures

protobuf-netで「コレクション文化」の値をシリアル化しながら、私は次のエラーを取得しています:

タイプが期待されず、契約はを推測することができません:可能System.Globalization.CultureInfo

enter image description here

は、私は事実を認識していたクラスにいるProtobufネットのニーズが[ProtoContract]と[ProtoMember]装飾が、それが唯一のカスタムユーザー定義のクラスのために可能です。

は、どのように私は私の場合の例可能System.Globalization.CultureInfoため、その後、.NETあらかじめ定義されたクラスで行くことができます。

はいるProtobufネットでこれでも可能ですか?

+0

なぜ文化情報をシリアライズしていますか? – Maarten

+0

私の答えはあなたを助けましたか?追加する必要があるものがあれば教えてください。 – Measuring

答えて

1

あなたは代理で行くことができます。コレクションをシリアライズする前にprotobuf-netに通知してください。私が現在持っているものは、組み込みの文化でしか機能しませんが、あなた自身で拡張して追加のデータを追加して、文化を完全に元に戻すことができます。

いるProtobufネット担持型内のCultureInfoを変換するサロゲート。

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

(あなたがコレクションをシリアル化され、少なくとも前の)プログラムの開始時に、このどこかを入れて:

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

をさらにご質問がある場合は、私がコメントで知らせてください。

関連する問題