如何配置 protobuf-net 的 RuntimeModel.Default 以支持序列化/反序列化 SessionSecurityToken?

2024-01-07

BinaryFormatter 能够简单地处理序列化:

private byte[] TokenToBytes(SessionSecurityToken token)
{
    if (token == null)
    {
        return null;
    }

    using (var memoryStream = new MemoryStream())
    {
        var binaryFormatter = new BinaryFormatter();
        binaryFormatter.Serialize(memoryStream, token);
        return memoryStream.ToArray();
    }
}

当我尝试用 protobuf-net 替换 BinaryFormatter 时:

using (var memoryStream = new MemoryStream())
{
    Serializer.Serialize(memoryStream, token);
    return memoryStream.ToArray();
}

我得到以下异常:

类型不是预期的,也无法推断出任何合同: System.IdentityModel.Tokens.SessionSecurityToken

我尝试添加:

RuntimeTypeModel.Default.Add(typeof(SessionSecurityToken), true);

这超越了异常,但我现在得到一个零字节数组。

如何正确配置 protobuf-net 来序列化 SessionSecurityToken?

另一方面,SessionSecurityToken 没有无参数构造函数。

using (var memoryStream = new MemoryStream(tokenAsBytes))
{
    return Serializer.Deserialize<SessionSecurityToken>(memoryStream);
}

抛出 ProtoException:

找不到 SessionSecurityToken 的无参数构造函数

BinaryFormatter能够毫不费力地做到这一点:

using (var memoryStream = new MemoryStream(bytes))
{
    var binaryFormatter = new BinaryFormatter();
    return (SessionSecurityToken)binaryFormatter.Deserialize(memoryStream);
}

如何正确配置 protobuf-net 来反序列化 SessionSecurityToken?


protobuf-net 并不声称能够序列化每种类型;事实上,通过大多数序列化器(XmlSerializer,任何 json 序列化器,DataContractSerializer, etc). BinaryFormatter是在不同的category序列化器 - 在这种特殊情况下,通过实现自定义序列化ISerializable.GetObjectData(SerializationInfo, StreamingContext).

构造函数是一个转移注意力的东西;实际上,protobuf-net 可以完全绕过构造函数,并且在这个特定场景中BinaryFormatter正在使用自定义序列化构造函数.ctor(SerializationInfo, StreamingContext).

对于简单的情况,protobuf-net 可以通过属性或运行时选项进行配置;对于更复杂的场景,代理人可以用于在表示之间进行映射 - 但是,在这种情况下我建议(查看SessionSecurityToken)这比您可能想要维护的更复杂。

在这里我会退后一两步;大多数序列化器旨在与data,而不是实现 - 并且与 DTO 等配合得很好。SessionSecurityToken非常多notDTO,并且没有简单的方法在它们之间进行切换。我强烈的建议是:序列化这是什么代表,不是什么is。但是,如果这是现有复杂模型的一部分并且确实很难分离出来,您可以切换回BinaryFormatter对于那些位。我还没有测试过这个,但请考虑:

RuntimeTypeModel.Default.Add(typeof(SessionSecurityToken), false)
        .SetSurrogate(typeof(BinaryFormatterSurrogate<SessionSecurityToken>));

With:

[ProtoContract]
public class BinaryFormatterSurrogate<T>
{
    [ProtoMember(1)]
    public byte[] Raw { get; set; }

    public static explicit operator T(BinaryFormatterSurrogate<T> value)
    {
        if(value==null || value.Raw == null) return default(T);
        using(var ms = new MemoryStream(value.Raw))
        {
            return (T)new BinaryFormatter().Deserialize(ms);
        }
    }
    public static explicit operator BinaryFormatterSurrogate<T>(T value)
    {
        object obj = value;
        if (obj == null) return null;
        using (var ms = new MemoryStream())
        {
            new BinaryFormatter().Serialize(ms, obj);
            return new BinaryFormatterSurrogate<T> { Raw = ms.ToArray() };
        }

    }
}

请记住,这只是将一个序列化器的输出作为原始数据嵌入到另一个序列化器中。幸运的是,protobuf-net 很乐意谈论二进制,因此这不会增加任何明显的开销(只是 blob 的标头和长度前缀) - 但它也不会做任何特别聪明或巧妙的事情SessionSecurityToken实例。如果这是only你正在序列化的东西,真的不值得。如果这只是较大 DTO 模型中的一个丑陋的凹凸,那么其中大部分can很好地序列化 - 那么它可能会为你完成工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何配置 protobuf-net 的 RuntimeModel.Default 以支持序列化/反序列化 SessionSecurityToken? 的相关文章

随机推荐

  • 使用服务器变量配置 URL 重写以支持多个源

    几天前我正在处理 CORS 问题 我需要支持多个来源 我做了一些研究 发现有几篇文章向我介绍了这个很棒的工具 URL 重写 我按照 Paco Zarate 提示得到了我想要的解决方案 具有多个域的访问控制允许来源 https stackov
  • $new = new self($data);带有私有函数甚至变量oO?

    我的 php 5 3 有一个奇怪的行为 我有一个类在函数中执行此操作 new new self data new gt setServiceManager this gt service new gt cacheInstance 但是函数c
  • 确定Linux键盘事件设备

    这另一个问题 从 Linux 输入设备访问按键 https stackoverflow com questions 20943322 accessing keys from linux input device 提供了有关如何在没有按下其他
  • 访问 numpy 数组中元素的属性

    我有一个充满对象 dtype object 的numpy数组cftime class In 1 a Out 1 array cftime DatetimeNoLeap 2000 1 1 11 29 59 999996 5 1 cftime
  • 什么是终结符和非终结符?

    我正在读 雷布尔 维基百科页面 https en wikipedia org wiki Rebol 解析表达式是用 parse 方言编写的 与 do 方言一样 它是数据交换方言的面向表达式的子语言 与 do 方言不同 parse 方言使用表
  • 如何在 Keras 中添加常量张量?

    我想做的是向网络的输出添加一个常量张量 inputs Input shape config N FRAMES IN SEQUENCE config IMAGE H config IMAGE W config N CHANNELS cnn V
  • 删除满足条件的一半数据帧行

    我希望根据条件提取数据帧的子集 比方说 df pd Dataframe Col1 values1 Col2 values2 Col3 values3 我想按 Col2 排序 在 Col2 中的负条目 如果有的话 中 我想删除最大的一半 因此
  • 使用 LINQ 从数据集中选择行,其中 RowsID 列表位于 List

    首先我必须说 我是一个使用 LINQ 的新手 实际上我以前从未使用过 但我有一个任务需要使用来自列表的值来过滤数据表 所以我想知道是否可以在 LINQ 中使用列表中的值作为过滤器值来查询数据表 有人可以给我一些提示 谢谢 执行此操作的最佳方
  • Flutter 图像选择器无法从相册/图库中选择图像

    我正在尝试在我的应用程序中实现 imagepicker 库 我的应用程序运行没有任何错误 但我无法从相册 图库中选取 选择图像 选择图像后 应用程序应在正文中显示图像 但没有任何反应 我必须点击 取消 才能返回主屏幕 我还应该提到控制台返回
  • JavaScript 图像调整大小

    有谁知道如何使用 JavaScript 按比例调整图像大小 我尝试通过添加属性来修改 DOMheight and width即时运行 但似乎在 IE6 上不起作用 要按比例修改图像 只需更改宽度 高度 CSS 属性之一 将另一个设置为自动
  • 从 Windows 命令行获取文件夹大小

    在 Windows 中 是否可以在不使用任何第三方工具的情况下从命令行获取文件夹的大小 我想要与右键单击 Windows 资源管理器 属性中的文件夹时获得的结果相同的结果 有一个内置 Windows 工具为了那个原因 dir s Folde
  • 如何避免锯齿并提高性能?

    In this 堆栈溢出答案 https stackoverflow com a 9709724 2345484事实证明 C 中的别名会降低代码速度 C 中的别名不仅适用于指针 还适用于引用 更普遍地适用于标准指定的这些类型 https s
  • ajax POST 后无法访问 JQuery $(this)?

    假设我有一堆共享点击事件的链接 a href class do stuff Click me a a href class do stuff Click me a a href class do stuff Click me a a hre
  • 使用 Utf8Json 库序列化时排除空字段?

    使用以下方法将 POCO 序列化为 JSON 字符串时 有什么方法可以忽略空字段Utf8Json图书馆 我有一个ToString我在外部使用的下面的类中的方法 所以我想看看是否有任何方法可以在进行序列化时排除空字段 基本上我不希望序列化后
  • 禁用 gcc 对不兼容选项的警告

    我很好奇是否有一个选项可以禁用 gcc 关于参数对正在编译的语言无效的警告 Ex cc1 warning command line option Wno deprecated is valid for C Java ObjC but not
  • 如何在显示 jQuery ui 选项卡时插入 JavaScript?

    我想在我的页面上运行 JavaScript 函数 但仅限于显示选项卡时 其实有两个问题 我没有使用 ajax 选项卡 那么如果我只想在显示选项卡后运行代码 我会将 JavaScript 放入 加载 或 显示 回调中吗 根据上面的答案 我的代
  • IE 和 Firefox 中的文本大小不同

    为什么 IE 中的文本比 Firefox 中的文本稍大 宽 示例 顶部是 IE 渲染文本的方式 底部是 FF Image http www dreamscape hu text jpg 在 CSS 中声明为 Arial 16px 的文本 我
  • 如何将 Xamarin Forms Shell 集成到 MvvmCross 设置中

    我打算将 Xamarin Forms 与 MvvmCross 一起使用 根据他们的tutorial https www mvvmcross com documentation tutorials tipcalc a xamarin form
  • 如何接入Kubernetes部署

    我已经创建了 Docker 映像 并部署在具有最少数量机器的 k8s 集群中 设置了一台主机和一台工作机 两台机器都已启动并运行 并使用相同的 VLAN 网络相互通信 请查找以下 Pod 和部署服务以及所描述的状态 root jenkins
  • 如何配置 protobuf-net 的 RuntimeModel.Default 以支持序列化/反序列化 SessionSecurityToken?

    BinaryFormatter 能够简单地处理序列化 private byte TokenToBytes SessionSecurityToken token if token null return null using var memo