首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#统一序列化Vector3类型

C#统一序列化Vector3类型
EN

Stack Overflow用户
提问于 2018-06-01 04:52:51
回答 1查看 3.3K关注 0票数 0

我有这个问题。(很抱歉有这些链接,但我还不能插入图片)。我想序列化一个gameObject的位置,旋转,名称和当前场景。但只有当前场景的对象名称(字符串)有效,位置数据(Vector3类型)和旋转(四元数类型)不起作用。这是要序列化的类,非常简单:

代码语言:javascript
复制
[Serializable]
     public class SpaceObjectData
     {


         [DataMember]
         public string sObjectName;

         [DataMember]
         public Vector3 transformPosition;

         [DataMember]
         public Quaternion transformRotation;

         [DataMember]
         public string sceneLocation;



     }

这是序列化我的类并将其保存到文件中的代码:

代码语言:javascript
复制
         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();


     }

这是保存的文件代码:

XML saved code

看起来一切正常,这是读取文件并反序列化数据流的函数:

代码语言:javascript
复制
  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)

         }
     }

Output Image

这有什么错呢?为什么不读取Vector3和四元数的数据呢?我应该如何保存Vector3和四元数,以便能够反序列化和读取它们?

EN

回答 1

Stack Overflow用户

发布于 2018-06-01 14:52:35

Vector3Quaternion是Unity类。我怀疑它们是否可以用DataContractSerializer序列化,这通常是您在使用[DataMember](https://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute(v=vs.110%29.aspx)属性时所指出的。

考虑使用内置的Unity序列化程序(您可以从成员中删除所有[DataMember]属性,因为它们是public,因此会自动序列化):

代码语言:javascript
复制
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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50632619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档