Protobuf-Net NotSupportedException: тип не может быть представлен как значение по умолчанию для закрытого неизменяемого типа (UnityEngine.Vector3) - PullRequest
0 голосов
/ 01 июня 2018

После ответов на Как сериализовать закрытый неизменяемый тип с типами protobuf-net и Protobuf-net и Unity3D , я попытался реализовать сериализатор, который может обрабатывать UnityEngine Vector3контейнер, единственными важными значениями которого являются Vector3.x, Vector3.y и Vector3.z:

Используя следующую TypeModel:

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.

1 Ответ

0 голосов
/ 01 июня 2018

Это, вероятно, ошибка в коде "карты", которую необходимо исправить.Вы можете избежать этого сейчас, добавив:

[ProtoMap(DisableMap = true)]

в свойство / поле, являющееся словарем.Разница между кодом «map» и исходным кодом pre-map очень тонкая и не очень интересная - она ​​в основном меняет то, что происходит в случае дубликатов - но: может показаться, что в «map» есть досадная ошибкалогика, что вероятно не существует в исходном пути кода.Тем не менее, путь «карта» теперь используется по умолчанию, поэтому существует обходной путь его отключения.

...