【问题标题】:Protobuf-Net NotSupportedException: Type cannot be represented as a default value for closed immutable type (UnityEngine.Vector3)Protobuf-Net NotSupportedException:类型不能表示为封闭不可变类型的默认值(UnityEngine.Vector3)
【发布时间】:2018-11-11 09:06:09
【问题描述】:

根据How to serialize a closed immutable type with protobuf-netProtobuf-net and Unity3D types 的答案,我尝试实现一个可以处理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);
    }
}

当使用任一方法尝试序列化Dictionary<int, Vector3> 时,会引发以下异常:

NotSupportedException: Type cannot be represented as a default value: UnityEngine.Vector3
ProtoBuf.Serializers.DefaultValueDecorator.EmitBranchIfDefaultValue (ProtoBuf.Compiler.CompilerContext ctx, ProtoBuf.Compiler.CodeLabel label) (at <5e93d5bf6f2048709aab19aea88deb74>:0)
...

我不确定如何修改我的 Typemodel 或协议定义以成功序列化 UnityEngine.Vector3 的集合。

【问题讨论】:

    标签: c# unity3d serialization protocol-buffers protobuf-net


    【解决方案1】:

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

    [ProtoMap(DisableMap = true)]
    

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

    【讨论】:

    • 我遇到了同样的错误,其属性定义如下: public Dictionary> Workflows { get;放; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2016-11-24
    相关资源
    最近更新 更多