小编Dyl*_*nis的帖子

Protobuf-Net NotSupportedException:类型不能表示为封闭的不可变类型(UnityEngine.Vector3)的默认值

遵循有关如何使用protobuf-netProtobuf-net以及Unity3D类型序列化不可变的封闭类型的答案之后,我尝试实现可处理UnityEngine的Vector3容器的序列化程序,其中唯一重要的值是Vector3.x,Vector3。 y和Vector3.z:

使用以下TypeModel:

serializer = TypeModel.Create();
serializer.UseImplicitZeroDefaults = false;
Run Code Online (Sandbox Code Playgroud)

然后,我尝试了两种不同的方法,分别为Vector3添加协议定义。明确的定义:

serializer.Add(typeof(Vector3), false).Add(1, "x").Add(2, "y").Add(3, "z");
Run Code Online (Sandbox Code Playgroud)

并使用代理:

serializer.Add(typeof(Vector3), false).SetSurrogate(typeof(SurrogateVector3));
Run Code Online (Sandbox Code Playgroud)

与代理类:

[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)
    { …
Run Code Online (Sandbox Code Playgroud)

c# serialization protocol-buffers protobuf-net unity-game-engine

1
推荐指数
1
解决办法
164
查看次数