代码之家  ›  专栏  ›  技术社区  ›  MunkiPhD

自定义泛型的序列化异常?

  •  5
  • MunkiPhD  · 技术社区  · 16 年前

    我正在尝试实现我自己的genericidentity实现,但当它尝试加载视图时(我使用的是ASP.NET MVC),会一直收到以下错误:

     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"
    

    我最后上了以下课:

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

    在global.asax中,我将cookie的序列化值读取到内存流中,然后使用该值创建OpenIDextendedEntity对象。经过无数次的尝试,我终于找到了一个解决办法。直到它尝试渲染视图的点,它才能正常工作。

    我试图实现的基本目标是能够执行以下操作(同时使用ASP.NET中的默认角色管理器):

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

    为了解决这个问题,我列出了一些我读过的资料来源。有些人报告了cassini错误,但其他人似乎已经成功实现了这种定制功能——这让我难以置信。

    3 回复  |  直到 16 年前
        1
  •  3
  •   j0k gauthamp    13 年前

    我不确定这是否是完全相同的问题,但在尝试创建自己的身份实现时,我遇到了相同的问题。

    This blog 解决了我的问题。

    问题似乎是Cassini中的标识序列化存在问题,但您可以通过从MarshalByRefObject派生类来解决问题:

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

    当然,您不能从genericidentity继承,但是您仍然可以实现genericidentity实现的IIdentity接口,因此您可以在大多数需要IIdentity的地方使用它。

        2
  •  0
  •   Community Mohan Dere    9 年前

    这似乎是VisualStudio(Web Development Server)的一个限制或错误,当我在VS2012中使用IIS Express或完整的IIS配置时,问题已得到解决。建议如下: https://stackoverflow.com/a/1287129/926064

        3
  •  0
  •   RasikaSam    11 年前

    “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");
        }
    }