我也不建议使用您的场景对象或域对象进行序列化。您将始终在两种不同的序列化要求之间进行斗争。
我建议将您的模型分为场景模型和持久性/序列化模型。
public class SerializableItemModel
{
public Vector3 position;
public Quaternion rotation;
public float _value;
}
然后有一个映射器可以在您的对象之间进行映射。
public class ItemToModelMapper
{
public SerializableItemModel MapToModel(Item item)
{
var model = new SerializableItemModel
{
position = item.transform.position;
rotation = item.transform.rotation;
_value = item._value;
};
return model
}
public Item MapFromModel(SerializableItemModel model)
{
return new Item(model.position, model.rotation, model._value);
}
}
如果你像这样分离你的对象,你将永远不必担心横切问题,比如序列化你的对象以保持持久性,并以某种方式在检查器中显示它等。如果你只想序列化 10% 的场景对象,那么你将其映射成一个小模型并对其进行序列化。
当然,这比您可能希望编写的代码要多得多。如果您愿意,您可以将 Item 提供给 SerializableItemModel 构造函数并跳过映射层。
public class SerializableItemModel
{
public Vector3 position;
public Quaternion rotation;
public float _value;
public SerializableItemModel(Item item)
{
this.position = item.transform.position;
this.rotation = item.transform.rotation;
this._value = item.transform._value;
}
}
现在您的代码在序列化时将如下所示:
private ItemToModelMapper mapper;
void Start()
{
Item item = new Item();
...
...
// Serialize
var serializationModel = this.mapper.MapToModel(item);
string json = JsonUtility.ToJson(serializationModel );
// Deserialize
SerializableItemModel deserializedModel = JsonUtility.FromJson<SerializableItemModel>(json);
Item loadedItem = this.mapper.MapFromModel(deserializedModel);
}
编辑:正如程序员所指出的,我从未解决过 Item 的检查器视图。因为 Item 类现在只有一个职责,所以欢迎您将 [SerializeField] 放在任何字段上,因为该对象不会用于任何其他序列化。您现在还可以使用任何您想要的序列化程序(JsonUtility、BinaryFormatter、JsonConvert、XmlSerializer 等)。