После ответов на Как сериализовать закрытый неизменяемый тип с типами 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.