【问题标题】:Polymorphism not working on collections elements using MessagePack-Csharp nuget多态性不适用于使用 MessagePack-Csharp nuget 的集合元素
【发布时间】:2018-05-15 15:54:13
【问题描述】:

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

有人遇到过这个问题吗?

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

[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 元素,它们都来自 Item Type。 你能告诉我我做错了什么吗?缺少什么?

关于项目定义的小更新:

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

这也行不通。 :(

【问题讨论】:

    标签: c# serialization msgpack


    【解决方案1】:

    看起来像 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 中反序列化时,此示例不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多