SerializationException与自定义GenericIdentiy?

时间:2009-09-14 03:19:21

标签: asp.net-mvc serialization

我正在尝试实现自己的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的序列化值读入内存流,然后使用它来创建我的OpenIDExtendedIdentity对象。经过各种各样的尝试后,我最终尝试了这种解决方案。它正常工作,直到它尝试渲染视图。

我基本上试图实现的是能够执行以下操作(使用asp.net中的默认角色管理器):

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

我已经列出了一些我试图解决这个问题的资料。有些人报告了Cassini错误,但似乎其他人已经成功实现了这种类型的自定义功能 - 因此令人难以置信。

3 个答案:

答案 0 :(得分:3)

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

This blog解决了我的问题。

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

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

当然,你不能继承GenericIdentity,但是你仍然可以实现GenericIdentity实现的IIdentity接口,所以你可以在大多数地方使用这个东西,至少可以使用IIdentity。

答案 1 :(得分:0)

这似乎是VisualStudio(Web开发服务器)的限制或错误,当我在VS2012中使用IIS Express或完整的IIS配置时,问题得到解决。像这里建议的那样:https://stackoverflow.com/a/1287129/926064

答案 2 :(得分:0)

来自This post的“baggadonuts”的解决方案解决了我的问题。复制下面的代码。

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