我不建议使用场景对象或领域对象进行序列化。你将会在两种不同的序列化需求之间进行搏斗。
我建议将你的模型分为场景模型和持久化/序列化模型。
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();
...
...
var serializationModel = this.mapper.MapToModel(item);
string json = JsonUtility.ToJson(serializationModel );
SerializableItemModel deserializedModel = JsonUtility.FromJson<SerializableItemModel>(json);
Item loadedItem = this.mapper.MapFromModel(deserializedModel);
}
编辑:如程序员所指出的,我从未涉及Item的检查器视图。因为Item类现在只有一个职责,您可以在任何字段上放置[SerializeFiled],因为这个对象不会用于任何其他序列化。您现在也可以使用任何您想要的序列化程序(JsonUtility、BinaryFormatter、JsonConvert、XmlSerializer等)。
JsonUtilty
并将其保存为json格式? - Scott Chamberlain