gpt4 book ai didi

protobuf-net 如何在使用索引属性时避免崩溃

转载 作者:行者123 更新时间:2023-12-01 01:25:08 24 4
gpt4 key购买 nike

我正在尝试将很棒的 protobuf-net 集成到现有的代码库中,但是在尝试处理自定义类型时遇到了崩溃。下面是一个小演示:它会抛出一个 InvalidOperationExceptionProtoBuf.Serializers.ListDecorator .但是,如果您注释掉索引器(或删除 IEnumerable 实现),则它会正常运行。

using System.Collections.Generic;
using ProtoBuf;
using System.Collections;

[ProtoContract]
public class MyClass : IEnumerable<int>
{
[ProtoMember(1, IsPacked = true)]
public int[] data { get; set; }

// Comment out this indexed property to prevent the crash
public int this[int i] { get { return data[i]; } set { data[i] = value; } }

public IEnumerator<int> GetEnumerator() { foreach (var x in data) yield return x; }
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }

static void Main(string[] args) { Serializer.PrepareSerializer<MyClass>(); }
}

难道我做错了什么?如何告诉 protobuf-net Serializer 忽略该 Indexer 属性?

谢谢!

编辑 (10 月 10 日):Marc 在 protobuf-net r447 中提供了一个修复程序。来自 [ProtoContract(IgnoreListHandling = true)] .

最佳答案

你的类型看起来很像一个集合,protobuf-net 确实试图这样处理它。一个“修复”是添加 Add(int)方法,因为这是反序列化时要使用的方法。然而,我正在调查为什么索引器的存在/不存在在这里会产生影响(这对我来说并不是很明显)。

请注意,因为这看起来很像一个集合,[ProtoMember(...)]可能不会在这里使用。在我发现索引器在这里扮演什么角色之前,我不能 100% 确定。

啊啊; k;找到索引器参与的原因 - 本质上是在检测到 IEnumerable 之后,它正在尝试识别 Type集合的;它使用各种线索:

  • <T>ICollection<T>
  • SomeTypeAdd(SomeType)
  • SomeTypepublic SomeTime this[int index] {...}索引器

  • 其中,唯一适用的是最后一个。但是,IMO 可能也应该使用 <T>IEnumerable<T> (我可能会对此进行调整) - 这至少会使这种情况变得不那么奇怪(就像改进错误消息一样,我会这样做)。

    总而言之,protobuf-net 对那些闻起来像集合的东西有很多非常特殊的处理方式;就个人而言,我会放弃 IEnumerable<T>支持,并让来电者通过 .data反而;该消息将(在某些时候)显示:

    Unable to resolve a suitable Add method for {FullName}

    关于protobuf-net 如何在使用索引属性时避免崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7654066/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com