为什么BinaryFormatter无法反序列化自己的结果

时间:2013-12-16 06:52:19

标签: c# deserialization wif claims-based-identity binaryformatter

我需要帮助来弄清楚为什么BinaryFormatter不能反序列化身份:

var identities = new[]
                     {
                         new ClaimsIdentity("Bug")
                             {
                                 Actor = new ClaimsIdentity("Bootstrap Context as a string")
                                         {
                                             BootstrapContext = "this causes issue"
                                         },

                                 BootstrapContext = new BootstrapContext("this raw token")
                             }
                     };

var sessionToken = new SessionSecurityToken(new ClaimsPrincipal(identities));
byte[] buffer;
using (var ms = new MemoryStream())
{
    var formatter = new BinaryFormatter();
    formatter.Serialize(ms, sessionToken);
    buffer = ms.ToArray();
}

using (var ms = new MemoryStream(buffer))
{
    var formatter = new BinaryFormatter();
    sessionToken = (SessionSecurityToken)formatter.Deserialize(ms);
}

这会导致带有内部消息的异常TargetInvocationException:

“无法将'System.String'类型的对象强制转换为'System.IdentityModel.Tokens.BootstrapContext'。” 我无法调试框架来自己弄清楚它,因此我请求您帮助找出这种意外行为的根源。

1 个答案:

答案 0 :(得分:3)

BootstrapContext中的ClaimsIdentity属性属于Object类型。这意味着您可以为其指定一个字符串(就像您一样)。但是,reading the documentation您可以看到它实际上应该是BootstrapContext对象,这可能是在反序列化期间预期的。