2009-09-14 11 views
5

私は(私はasp.net MVCを使用しています)私自身のGenericIdentity実装を実現するが、それはビューをロードしようとすると、次のエラーを受信し続けるためにしようとしている:カスタムのGenericIdentiyを持つSerializationException?

System.Runtime.Serialization.SerializationException was unhandled 
by user code Message="Type is not resolved for member 
'OpenIDExtendedIdentity,Training.Web, Version=1.0.0.0, 
Culture=neutral, PublicKeyToken=null'." 
     Source="WebDev.WebHost" 

私が終わってきました以下のクラス:私は私のOpenIDExtendedIdentityオブジェクトを作成するためにそれを使用、メモリストリームにクッキーのシリアル化された値を読み、私のGlobal.asaxで

[Serializable] 
    public class OpenIDExtendedIdentity : GenericIdentity { 
     private string _nickName; 
     private int _userId; 

     public OpenIDExtendedIdentity(String name, string nickName, int userId) 
      : base(name, "OpenID") { 
      _nickName = nickName; 
      _userId = userId; 
     } 
     public string NickName { 
      get { return _nickName; } 
     } 

     public int UserID { 
      get { return _userId; } 
     } 
    } 

。私は、さまざまな種類の無数の試行の後に、この試みを解決に終えました。それは、ビューをレンダリングしようとするポイントまで正しく動作します。

User.Identity.UserID 
User.Identity.NickName 
... etc. 

私がきた情報源のいくつかをリストアップしました:私は基本的に達成しようとしてることは(asp.netからデフォルトのロールマネージャを使用している間)は、次の操作を行うことができることである何

これを解決するために私の試みを読んでください。一部の人々はカッシーニのエラーを報告していますが、このタイプのカスタム機能を他の人が成功させたように思えます。

答えて

3

私は、これは正確に同じ問題であるかどうかわからないんだけど、自分のアイデンティティーを作成しようとしたとき、私は同じ問題に遭遇しました実装。

This blog私の問題を解決しました。

問題がカッシーニのIDシリアライズの問題だが、あなたはMarshalByRefObjectからクラスを派生させて、それを回避することができているようだ:

[Serializable] 
public class MyUser : MarshalByRefObject, IIdentity 
{ 
    public int UserId ... 

あなたはもちろん、その後、GenericIdentityから継承することはできませんしかし、GenericIdentityが実装するIIdentityインタフェースを実装することはできます。したがって、少なくともIIdentityを必要とするほとんどの場所でそのことを使用できます。

0

Visual Studio(Web開発サーバー)の制限またはバグのようですが、VS2012または完全なIIS構成でIIS Expressを使用した場合、問題は修正されました。ここに示唆したように:https://stackoverflow.com/a/1287129/926064

0

"baggadonuts"のソリューションはThis postで解決しました。下にコピーされたコード。

[Serializable] 
public class StubIdentity : IIdentity, ISerializable 



public void GetObjectData(SerializationInfo info, StreamingContext context) 
{ 
    if (context.State == StreamingContextStates.CrossAppDomain) 
    { 
     GenericIdentity gIdent = new GenericIdentity(this.Name, this.AuthenticationType); 
     info.SetType(gIdent.GetType()); 

     System.Reflection.MemberInfo[] serializableMembers; 
     object[] serializableValues; 

     serializableMembers = FormatterServices.GetSerializableMembers(gIdent.GetType()); 
     serializableValues = FormatterServices.GetObjectData(gIdent, serializableMembers); 

     for (int i = 0; i < serializableMembers.Length; i++) 
     { 
      info.AddValue(serializableMembers[i].Name, serializableValues[i]); 
     } 
    } 
    else 
    { 
     throw new InvalidOperationException("Serialization not supported"); 
    } 
} 
関連する問題