JSON
Unity
Unity2017

Unity List<Vector3>をシリアライズして保存したい。。

試した環境

  • Unity5.6
  • Unity2017
  • mac osx sierra

シリアライズして保存するところ

GameManager.cs
    void Save<T>(string key, T obj)
    {
        if (null == obj) return;
        var mem = new MemoryStream();
#if UNITY_IOS
            System.Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");
#endif
        var b = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();


        b.Serialize(mem, obj);
        PlayerPrefs.SetString(key, System.Convert.ToBase64String(mem.ToArray()));
    }

試した事。

GameManager.cs
public List<Vector3> segmentPos;
SerializationException: Type UnityEngine.Vector3 is not marked as Serializable.

Vector3のシリアライズはアクセサがないからかな。。

GameManager.cs
public List<Vector3> segmentPos {get;set;} = List<Vector3>();
public List<Vector3> gnormales {get;set;} = new List<Vector3>();
Assets/Scripts/Obj/Bonsai/LSystemsModel.cs(28,26): 
error CS1644: Feature `auto-implemented property initializer' 
cannot be used because it is not part of the C# 4.0 language specification

この書き方はC#4.0以降じゃないと、だめみたいなので、
Unity5.6から、Unity2017にアップデートし。

PlayerSettingのConfigrationを、「.Net4.6」にし、Unity再起動。

エラーが消えた!

が、

SerializationException: Type 'UnityEngine.Vector3' in Assembly 'UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

Vector3や、Vector2、Quaternion等のUnityEngineの構造体は、
シリアライズできないみたいなので。

結局、Vector3をカスタムで構造体化。

参考:https://github.com/KeenSoftwareHouse/SpaceEngineers/blob/master/Sources/VRage/Serialization/SerializableVector3.cs

Listから、配列にいれたかったので、
ToArray()メソッド等考慮。

で一応保存実行できた。。が、

読み込み時に、こんどはこういうエラーが。

SerializationException: End of Stream encountered before parsing was completed.

シリアライズするまえに処理がおわったってこと?

で、結局。
JsonUtilityというのを使うとすべて解決してしまったww。

参考にさせて頂いたサイト
http://qiita.com/keidroid/items/24e03f82d74560dc557a

http://ch.nicovideo.jp/ntmi/blomaga/ar927398