为了账号安全,请及时绑定邮箱和手机立即绑定

Protobuf-Net NotSupportedException:

Protobuf-Net NotSupportedException:

C#
哈士奇WWW 2021-07-05 15:14:07
根据如何使用 protobuf-net和Protobuf-net 和 Unity3D 类型序列化封闭的不可变类型的答案,我尝试实现一个可以处理 UnityEngine 的 Vector3 容器的序列化程序,其中唯一重要的值是 Vector3.x、Vector3。 y 和 Vector3.z:使用以下类型模型:serializer = TypeModel.Create();serializer.UseImplicitZeroDefaults = false;然后我分别尝试了两种不同的方法,为 Vector3 添加协议定义;明确的定义:serializer.Add(typeof(Vector3), false).Add(1, "x").Add(2, "y").Add(3, "z");并使用代理:serializer.Add(typeof(Vector3), false).SetSurrogate(typeof(SurrogateVector3));使用代理类:[ProtoContract]public sealed class SurrogateVector3{    [ProtoMember(1)]    float x;     [ProtoMember(2)]    float y;     [ProtoMember(3)]    float z;    public SurrogateVector3()    {}    public SurrogateVector3(float x, float y, float z)    {        this.x = x;        this.y = y;        this.z = z;    }    public static implicit operator Vector3(SurrogateVector3 v)    {        return new Vector3(v.x, v.y, v.z);    }    public static implicit operator SurrogateVector3(Vector3 v)    {        return new SurrogateVector3(v.x, v.y, v.z);    }}使用任一方法尝试序列化 a 时Dictionary<int, Vector3>,会引发以下异常:NotSupportedException: Type cannot be represented as a default value: UnityEngine.Vector3ProtoBuf.Serializers.DefaultValueDecorator.EmitBranchIfDefaultValue (ProtoBuf.Compiler.CompilerContext ctx, ProtoBuf.Compiler.CodeLabel label) (at <5e93d5bf6f2048709aab19aea88deb74>:0)...我不确定如何修改我的 Typemodel 或协议定义以成功序列化 UnityEngine.Vector3 的集合。
查看完整描述

1 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

这可能是“地图”代码中的一个错误,需要修复。您现在可以通过添加以下内容来避免它:

[ProtoMap(DisableMap = true)]

到作为字典的属性/字段。“地图”代码和原始“地图”代码之间的区别很微妙而且不是很有趣——它主要改变了重复情况下发生的事情——但是:“地图”中似乎有一个恼人的错误逻辑,这可能不存在于原始代码路径中。但是,“地图”路径现在是默认路径,因此禁用它的解决方法。


查看完整回答
反对 回复 2021-07-17
  • 1 回答
  • 0 关注
  • 241 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信