C # Unity сериализация Vector3 типов - PullRequest
0 голосов
/ 31 мая 2018

У меня есть эта проблема.(извините за ссылки, но я пока не могу вставлять изображения).Я хотел бы сериализовать положение, вращение, имя и текущую сцену 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();


     }

Это код сохраненного файла:

XML-код, сохраненный

все выглядит нормально. Это функция для чтения файла и десериализации потока:

  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, чтобы иметь возможность десериализовать и прочитать их?

1 Ответ

0 голосов
/ 01 июня 2018

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);
...