多态性不适用于使用 MessagePack-Csharp nuget 的集合元素

2023-12-05

我无法反序列化实例之间具有继承关系的元素集合。

有人遇到过这个问题吗?

所以我的用例是这样的: 我的模型与此类似:

[DataContract]
    public class Item
    {
        [DataMember]
        public int Id { get; set; }

        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public bool Valid { get; set; }


    }

    [DataContract]
    public class IntermediateItem : Item
    {
        [DataMember]
        public int Priority { get; set; }
    }

    [DataContract]
    public class ExtendedItem : IntermediateItem
    {
        [DataMember]
        public int Count { get; set; }

        [DataMember]
        public ItemsCollection Childs { get; set; }
    }

Items Collection 是这样的:

 [DataContract]
    public class ItemsCollection : Collection<Item>
    {
     }

我为确保正确反序列化所做的设置是: 定义 CollectionFormatterBase:

 public class ItemCollectionFormatterBase : CollectionFormatterBase<Item, ItemsCollection>
    {
        protected override ItemsCollection Create(int count)
        {
            return new ItemsCollection();
        }

        protected override void Add(ItemsCollection collection, int index, Item value)
        {
            collection.Add(value);
        }
    }

不起作用的例子,我的意思是,反序列化的实例都是基本类型,继承关系在序列化中丢失了一些。

例子:

   MessagePack.Resolvers.CompositeResolver.RegisterAndSetAsDefault(new[] { new ItemCollectionFormatterBase() }, new[] { StandardResolver.Instance });


ExtendedItem instance = new ExtendedItem()
            {
                Id = 1,
                Name = "Extended Item",
                Priority = 121,
                Valid = true,
                Count = 10,
                Childs = new ItemsCollection(new List<Item>() { new Item() { Id = 1 }, new IntermediateItem() { Priority = 10 }, new ExtendedItem() { Count = 10 } })

            };

 byte[] bytes  = MessagePackSerializer.Serialize(instance);

          using (FileStream file = new FileStream(this.filePath.AbsolutePath, FileMode.Create))
            {
                await file.WriteAsync(bytes  , 0, payload.Length);
                await file.FlushAsync();
            }

  using (FileStream file = new FileStream(testsFolder + @"\ExtendedItem.msgPack-csharp.dat", FileMode.Open))
                {

                    file.Seek(0, SeekOrigin.Begin);
                    deserializedInstance =  MessagePackSerializer.Deserialize<ExtendedItem>(file);

                }

查看 deserializedInstance Childs 元素,它们都来自项目类型。 你能告诉我我做错了什么吗?缺什么 ?

关于项目定义的一个小更新:

 [DataContract]  
    [KnownType(typeof(IntermediateItem))]
    [KnownType(typeof(ExtendedItem))]
    public class Item
    {
        [DataMember]
        public int Id { get; set; }

        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public bool Valid { get; set; }
    }

这也是行不通的。 :(


看起来 MessagePackSerializer 静态类型作为称为 Typeless 的静态内部类,解决了我的问题:

使用 ExtendedItem 的实例:

  ExtendedItem instance = new ExtendedItem()
            {
                Id = 1,
                Name = "Extended Item",
                Priority = 121,
                Valid = true,
                Count = 10,
                Childs = new ItemsCollection(new List<Item>() { new Item() { Id = 1 }, new IntermediateItem() { Priority = 10 }, new ExtendedItem() { Count = 10 } })

            };

我能够对其进行序列化并成功反序列化!

 byte[] bytes = MessagePackSerializer.Typeless.Serialize(instance);

                await fileManager.WriteAsync(bytes);

                ExtendedItem deserializedInstance = null;

                deserializedInstance = MessagePackSerializer.Typeless.Deserialize(bytes) as ExtendedItem;

尽管序列化和反序列化在 .NET 上有效,但在使用 msgpackjs 包在 Nodejs 中反序列化时,该示例不起作用。

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

多态性不适用于使用 MessagePack-Csharp nuget 的集合元素 的相关文章

随机推荐

  • 删除运行时正在使用的文件

    如何删除运行时某个进程正在使用 打开的文件 我在我的项目中使用 vb net 图像显示在图片框中 并且应该删除它 而不关闭该文件 如果该文件被另一个进程以独占模式打开 则您不能 Windows 不允许您这样做 在这种情况下 您能做的最好的事
  • 如何将软件包(例如 libjpeg-dev)自动加载到我的 Elastic Beanstalk 应用程序?

    我有一个运行 Python 的自动缩放 Elastic Beanstalk 应用程序 我想在其中使用 PIL 当我这样做时 它说我的 jpeg 解码器丢失 我需要安装 libjpeg 所以我在这里遵循AWS官方指南的 配置文件 http d
  • 为什么我的大型 JSF 数据表不只在 IE 中填充?

    我正在尝试使用 JSF 中的 HtmlDataTable 动态生成一个表 当我给出的行数和列数均大于 25 时 某些单元格仅在 IE 中不会填充 并且速度变得非常慢 但是 我可以在使用 Firebug 调试代码时看到该值 它在 Firefo
  • 如何在 webdriver (Python) 中打开新窗口或选项卡?

    我尝试过各种命令 例如 driver switch to window blank or driver switch to window None 但这些都不起作用 这应该怎么做 谢谢 经过大量的谷歌搜索后 我发现了 Firefox 中对我
  • 使用 Ruby On Rails 的多个用户模型,并设计有单独的注册路线,但有一个通用的登录路线

    首先 我在谷歌和雅虎上进行了大量搜索 并找到了一些关于我的主题的回复 但它们都没有真正涵盖我需要知道的内容 我的应用程序中有多个用户模型 目前是客户 设计师 零售商 而且似乎还会有更多 他们的表中以及网站上允许或不允许的几个区域中都存储了不
  • “git commit”出现意外行为。当预提交挂钩修改暂存文件时

    在我的经验中git commit a具有等同的行为git commit 但是 最近我创建了一个预提交挂钩 可以自动格式化我的源代码 现在git commit 有一些意想不到的副作用 提交命令完成后 提交的文件最终会在工作目录和索引中被修改
  • 为什么javascript的handleEvent方法可以访问省略事件参数的事件? [复制]

    这个问题在这里已经有答案了 根据MDN doc handleEvent方法有event作为它的单个参数 但是这个例子 Codepen html代码
  • 无法共同创建对象

    我在 net中创建了一个dll 并使用jacob从java程序中调用它 因为昨天我有Windows 7 32位操作系统 所以程序成功运行 现在我格式化并安装了Windows 7 64位操作系统 所以遇到以下错误 com jacob com
  • div 上的全角背景颜色

    我正在使用 1120px css 响应式框架 或者它可以在我需要时充当固定网格 我在 1120px 容器 div 内有一个 div 我想在其上应用全宽背景颜色 div 的背景颜色当然仅位于容器 div 内部 我想让它填充 body 元素的整
  • 如何计算形状相交的多边形数量?

    我有一个非常大的数据集 其中包含多边形和点 周围有缓冲区 我想在点数据中创建一个新列 其中包括点缓冲区相交的多边形数量 这是一个简化的例子 import pandas as pd import geopandas as gp from sh
  • 如何分析混淆矩阵?

    当我打印 scikit learn 的混淆矩阵时 我收到一个非常巨大的矩阵 我想分析什么是真阳性 真阴性等 我该怎么做 这就是我的混淆矩阵的样子 我希望更好地理解这一点 4015 336 0 0 0 2 228 2704 0 0 0 0 4
  • 在 Java Swing 中检查点是否在线

    我画了一条线 然后画了一个点 然后我想检查该点是否在线上 我在数组中获取了一条线坐标 因为有多条线 我想检查最后一行的当前点吗 if positionX1 positionX2 positionY1 positionY2 float m l
  • 使用 C# 的电子邮件中的多个附件文件

    如何使用 C 在电子邮件中附加多个文件 MailMessage mail new MailMessage SmtpClient SmtpServer new SmtpClient smtp gmail com get the userID
  • 如何在ubuntu上编译curlpp?

    下面是使用curl的简单test c代码 include
  • 使用 matcher() 匹配字符串中的小数

    我有一个关于匹配器的问题 目前我正在尝试读取一个字符串并将所有数字存储到一个数组中 我的问题是 你如何尝试匹配整数和小数 我有一个双打数组 名为 double thisArray new double 20 在这个数组中 我试图存储从字符串
  • HTML5 Web 语音 API 无法在本地运行

    我试图让这段代码工作 但不知道为什么它在本地不起作用 我在 CodePen io 上尝试了同样的方法 它有效
  • jQuery 提交表单无需重新加载页面

    好的 所以我正在尝试使用 jquery 和经典 ASP 从我的网站创建一个新的登录表单 截至目前 我的文档中有一个包含 div 该 div 设置为隐藏 然后当用户选择登录链接时 div 将淡出并覆盖带有表单的页面 如果用户单击提交 页面将
  • 处理禁用节点上的事件

    有什么方法可以处理鼠标单击 例如在禁用的元素上 我的任务是禁用列表并在双击它后将其启用 禁用的节点不会接收鼠标或按键事件 See the 官方文档 您可以将该节点包装到另一个节点中 并在那里处理鼠标事件 以防子节点被禁用
  • 如何在 asp.net 3.5 中会话超时时将用户重定向到默认页面

    我只想在 asp net 3 5 中会话过期时将用户重定向到主页 Default aspx 我只是用网络用户控制来做到这一点 但钢它不能完美地工作 所以我只想用 web config 来做到这一点
  • 多态性不适用于使用 MessagePack-Csharp nuget 的集合元素

    我无法反序列化实例之间具有继承关系的元素集合 有人遇到过这个问题吗 所以我的用例是这样的 我的模型与此类似 DataContract public class Item DataMember public int Id get set Da