2

この質問への回答のように実装したいくつかのタイプセーフな列挙型をシリアル化しようとしています。たとえば、(リンクした回答から) への参照を含むオブジェクトをシリアル化する場合FORMS、逆シリアル化時に static フィールドへの参照を復元したいと思いますFORMS

私には解決策がありますが、タイプセーフな列挙型を含むクラスに追加する必要があるため、それはちょっとくだらないようです。コールバックを使用して、列挙型のvalueフィールドを保存および取得するだけです。

    public class SomethingContainingAnAuthenticationMethod
    {
      [ProtoMember(1)] 
      public int AuthenticationMethodDataTransferField { get; set; }

      public AuthenticationMethod AuthenticationMethod { get; set; }

      [ProtoBeforeSerialization]
      public void PopulateDataTransferField()
      {
        AuthenticationMethodDataTransferField = AuthenticationMethod.value;
      }

      [ProtoAfterDeserialization]
      public void PopulateAuthenticationMethodField()
      {
        AuthenticationMethod = AuthenticationMethod.FromInt(AuthenticationMethodDataTransferField);
      }
    }

他のアイデアは大歓迎です。

4

2 に答える 2

2

リンクされた例の答えでは、最も簡単なアプローチはおそらく次のとおりです。

[ProtoContract]
public class SomethingContainingAnAuthenticationMethod
{
  [ProtoMember(1)] 
  private int? AuthenticationMethodDataTransferField {
      get { return AuthenticationMethod == null ? (int?)null
                               : AuthenticationMethod.Value; }
      set { AuthenticationMethod = value == null ? null
                               : AuthenticationMethod.FromInt(value.Value); }
  }

  public AuthenticationMethod AuthenticationMethod { get; set; }
}

これにより、余分なフィールドとコールバックが回避されます。サロゲート型を介して同様のことを行うこともできますが、上記はほとんどの単純なケースで機能するはずです。

于 2012-11-11T20:14:11.233 に答える
1

列挙メンバーをシリアル化するメカニズムは非常に単純です。

[ProtoContract]
public class SomethingContainingAnAuthenticationMethod
{
    [ProtoMember(1)] 
    public AuthenticationMethod AuthenticationMethod { get; set; }
}

そして...それだけです。マイナーな落とし穴 (値を持つ列挙型を見つけることができないというエラーが発生する可能性があります) は、暗黙的なゼロの動作ですが、それは単純に回避されます。

    [ProtoMember(1, IsRequired=true)] 
    public AuthenticationMethod AuthenticationMethod { get; set; }
于 2012-11-10T08:07:15.367 に答える