由自定义标识和GenericPrincipal引起的序列化异常

时间:2011-10-17 18:32:35

标签: c# .net serialization

我一直在关注如何使用.net实现自定义基本身份验证的文章。

这是article

代码使用了一个接口 - IBasicUser - 来自IIdentity。 BasicUser类实现IBasicUser。 创建了一个BasicUser实例,并从中构建了GenericPrincipal。

IBasicUser bu = new BasicUser();
context.Context.User = new GenericPrincipal(bu, new string[] { });

当我运行代码时,我得到一个例外。

Type 'Smithfamily.Blog.Samples.BasicUser' in assembly 'LM_TESTS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable. 

所以我查看了Reflector中的System.Security.Principal.GenericIdentity类,发现它确实标有属性[Serializable。标记有ComVisible特性(真)]

IIdentity上的Documentation没有说明需要可序列化的实现。从异常和反射器我假设它确实如此。所以我将[Serializable]属性添加到BasicUser类。

现在我在运行代码时遇到一个新的异常。

[SerializationException: Type is not resolved for member 'Smithfamily.Blog.Samples.BasicUser,LM_TESTS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.]

我对序列化不是很熟悉,也不太了解发生了什么或问题是什么。请你帮忙开导我。感谢。

3 个答案:

答案 0 :(得分:1)

您是否在VS Web开发服务器中托管您的网站?如果是这样,看起来你偶然发现了MS Connect中记录的错误...

http://connect.microsoft.com/VisualStudio/feedback/details/274696/using-custom-identities-in-asp-net-fails-when-using-the-asp-net-developement-server

如果我正确地阅读了这篇文章和其他帖子,那么修复就是GAC你的DLL,以便通过.NET探测找到它并在运行时加载。

答案 1 :(得分:1)

Change:

public class CustomIdentity : IIdentity

For:

public class CustomIdentity : MarshalByRefObject, IIdentity

Not use that:

[Serializable]
public class CustomIdentity : IIdentity

答案 2 :(得分:0)

最后,我刚刚从VWD开发服务器上的应用程序测试切换到在Windows 7上的本地iis 7.5 express上进行测试。这似乎是简单的解决方案。