我正在嘗試爲名爲Transform
的第三方類創建代理。我需要序列化它的一些公共成員,包括對另一個這樣的類實例的引用,並公開內部列表Transforms
。所以我寫了替代品,但我不確定是否可以在替代品的字段上定義[ProtoMember]
屬性,該屬性的類型爲Transform
。或者他們應該是TransformSurrogate
?現在,我的代碼是:代理類可以包含對原始類的引用
[ProtoContract(AsReferenceDefault = true)]
public class TransformSurrogate {
[ProtoMember(1)]
Vector3 localPosition { get; set; }
[ProtoMember(2)]
Vector3 localScale { get; set; }
[ProtoMember(3)]
Quaternion localRotation { get; set; }
[ProtoMember(4, AsReference = true)]
Transform parent { get; set; }
[ProtoMember(5, AsReference = true)]
List<Transform> children { get; set; }
public static explicit operator TransformSurrogate(Transform transform) {
if (transform == null) return null;
var surrogate = new TransformSurrogate();
surrogate.localPosition = transform.localPosition;
surrogate.localRotation = transform.localRotation;
surrogate.localScale = transform.localScale;
surrogate.parent = transform.parent;
surrogate.children = new List<Transform>();
for (int i = 0; i < transform.childCount; ++i) {
surrogate.children.Add(transform.GetChild(i));
}
return surrogate;
}
public static explicit operator Transform(TransformSurrogate surrogate) {
if (surrogate == null) return null;
var transform = new GameObject().transform;
transform.localPosition = surrogate.localPosition;
transform.localRotation = surrogate.localRotation;
transform.localScale = surrogate.localScale;
transform.parent = (Transform) surrogate.parent;
foreach (var child in surrogate.children) {
child.parent = transform;
}
return transform;
}
}
不要太注意Vector3
和Quaternion
班 - 他們很容易序列化的結構。所以我定義自己的RuntimeTypeModel
爲Transform
類型是這樣的:
Model.Add(typeof(Transform), false).SetSurrogate(typeof(TransformSurrogate));
不過,我反序列化過程中得到一個錯誤,告訴我的Protobuf是無法類之間的轉換。我在想,這是因爲在代理類中混合了原始類,但我不確定。
在一個依賴於非核心類型的複雜類型的環境中,這很難回答;你有沒有用簡單的本地類型演示問題的例子? – 2014-09-25 11:09:37
@MarcGravell現在我試圖在更簡單的環境中對這種情況建模,但是如果您想知道Vector3和Quaternion類型是什麼 - 您可以跳過這些,因爲它們是簡單的結構,並且我已成功將它們序列化。我現在主要關注的只是Transform類。如果有幫助,Transform是Unity3D的內置類型。 – GuardianX 2014-09-25 12:24:31