根據(jù)如何使用 protobuf-net和Protobuf-net 和 Unity3D 類型序列化封閉的不可變類型的答案,我嘗試實(shí)現(xiàn)一個(gè)可以處理 UnityEngine 的 Vector3 容器的序列化程序,其中唯一重要的值是 Vector3.x、Vector3。 y 和 Vector3.z:使用以下類型模型:serializer = TypeModel.Create();serializer.UseImplicitZeroDefaults = false;然后我分別嘗試了兩種不同的方法,為 Vector3 添加協(xié)議定義;明確的定義: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 時(shí)Dictionary<int, Vector3>,會(huì)引發(fā)以下異常: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 或協(xié)議定義以成功序列化 UnityEngine.Vector3 的集合。
1 回答

心有法竹
TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊
這可能是“地圖”代碼中的一個(gè)錯(cuò)誤,需要修復(fù)。您現(xiàn)在可以通過(guò)添加以下內(nèi)容來(lái)避免它:
[ProtoMap(DisableMap = true)]
到作為字典的屬性/字段?!暗貓D”代碼和原始“地圖”代碼之間的區(qū)別很微妙而且不是很有趣——它主要改變了重復(fù)情況下發(fā)生的事情——但是:“地圖”中似乎有一個(gè)惱人的錯(cuò)誤邏輯,這可能不存在于原始代碼路徑中。但是,“地圖”路徑現(xiàn)在是默認(rèn)路徑,因此禁用它的解決方法。
- 1 回答
- 0 關(guān)注
- 260 瀏覽
添加回答
舉報(bào)
0/150
提交
取消