我有这个问题。 (对不起链接但我不允许插入图片)。 我想序列化gameObject的位置,旋转,名称和当前场景。 但只有当前场景(字符串)的对象名称可以正常工作,而不是位置数据(Vector3类型)和旋转(四元数类型)。 这是要序列化的类,非常简单:
[Serializable]
public class SpaceObjectData
{
[DataMember]
public string sObjectName;
[DataMember]
public Vector3 transformPosition;
[DataMember]
public Quaternion transformRotation;
[DataMember]
public string sceneLocation;
}
这是序列化我的类并将其保存在文件中的代码:
public void SetState()
{
// Stream the file with a File Stream. (Note that File.Create() 'Creates' or 'Overwrites' a file.)
FileStream file = File.Create(path);
//Serialize to xml
DataContractSerializer bf = new DataContractSerializer(ObjectData.GetType());
MemoryStream streamer = new MemoryStream();
//Serialize the file
bf.WriteObject(streamer, ObjectData);
streamer.Seek(0, SeekOrigin.Begin);
//Save to disk
file.Write(streamer.GetBuffer(), 0, streamer.GetBuffer().Length);
file.Close();
}
这是保存的文件代码:
一切似乎都好 这是读取文件和反序列化流的功能: public void GetState()
{
if (System.IO.File.Exists(path))
{
string text = System.IO.File.ReadAllText(path);
using (Stream stream = new MemoryStream())
{
byte[] bytes = Encoding.UTF8.GetBytes(text);
stream.Write(bytes, 0, bytes.Length);
stream.Position = 0;
DataContractSerializer serializer = new DataContractSerializer((ObjectData.GetType()));
ObjectData = (SpaceObjectData)serializer.ReadObject(stream);
}
print(ObjectData.sObjectName); //output OK
print(ObjectData.sceneLocation); //output OK
print(ObjectData.transformPosition); //output wrong (always 0,0,0)
print(ObjectData.transformRotation); //output wrong (always 0,0,0,0)
}
}
哪里错了? 为什么不读取Vector3和Quaternion数据? 我应该如何保存Vector3和Quaternions以便能够反序列化和读取它们?
答案 0 :(得分:2)
Vector3
和Quaternion
是Unity类。我怀疑它们是否可以使用DataContractSerializer
进行序列化,这通常是您在使用[DataMember]属性时指示的内容。
考虑使用内置的Unity序列化程序(您可以从成员中删除所有[DataMember]
属性,因为它们是public
,因此会自动序列化):
using System.IO;
//Save your SpaceObjectData object to a file, as a json string.
string data = JsonUtility.ToJson(yourSpaceDataObject, true); //pretty print!
File.WriteAllText(filePath, data);
//Read your SpaceObjectData from file
string retrievedData = File.ReadAllText(filePath);
SpaceObjectData retrievedObject = JsonUtility.FromJson<SpaceObjectData>(retrievedData);