public bool OpenDeserialize (byte[] bytes) { #if !ASTAR_NO_JSON // Enqueue some converters so that we can deserialize Unity builtin types readerSettings = new JsonReaderSettings(); readerSettings.AddTypeConverter (new VectorConverter()); readerSettings.AddTypeConverter (new BoundsConverter()); readerSettings.AddTypeConverter (new LayerMaskConverter()); readerSettings.AddTypeConverter (new MatrixConverter()); readerSettings.AddTypeConverter (new GuidConverter()); readerSettings.AddTypeConverter (new UnityObjectConverter()); #endif str = new MemoryStream(); str.Write(bytes,0,bytes.Length); str.Position = 0; try { zip = ZipFile.Read(str); } catch (Exception e) { //Catches exceptions when an invalid zip file is found Debug.LogWarning ("Caught exception when loading from zip\n"+e); str.Dispose (); return false; } meta = DeserializeMeta (zip["meta"+jsonExt]); if (FullyDefinedVersion(meta.version) > FullyDefinedVersion(AstarPath.Version)) { Debug.LogWarning ("Trying to load data from a newer version of the A* Pathfinding Project\nCurrent version: "+AstarPath.Version+" Data version: "+meta.version + "\nThis is usually fine as the stored data is usually backwards and forwards compatible." + "\nHowever node data (not settings) can get corrupted between versions, so it is recommended " + "to recalculate any caches (those for faster startup) and resave any files. Even if it seems to load fine, it might cause subtle bugs.\n"); } else if (FullyDefinedVersion(meta.version) < FullyDefinedVersion(AstarPath.Version)) { Debug.LogWarning ("Trying to load data from an older version of the A* Pathfinding Project\nCurrent version: "+AstarPath.Version+" Data version: "+meta.version+ "\nThis is usually fine, it just means you have upgraded to a new version." + "\nHowever node data (not settings) can get corrupted between versions, so it is recommended " + "to recalculate any caches (those for faster startup) and resave any files. Even if it seems to load fine, it might cause subtle bugs.\n"); } return true; }
private GraphMeta DeserializeMeta (ZipEntry entry) { if ( entry == null ) throw new Exception ("No metadata found in serialized data."); #if !ASTAR_NO_JSON string s = GetString (entry); var reader = new JsonReader(s,readerSettings); return (GraphMeta)reader.Deserialize(typeof(GraphMeta)); #else var meta = new GraphMeta(); var mem = new System.IO.MemoryStream(); entry.Extract (mem); mem.Position = 0; var reader = new System.IO.BinaryReader(mem); if ( reader.ReadString() != "A*" ) throw new System.Exception ("Invalid magic number in saved data"); int major = reader.ReadInt32 (); int minor = reader.ReadInt32 (); int build = reader.ReadInt32 (); int revision = reader.ReadInt32 (); // Required because when saving a version with a field not set, it will save it as -1 // and then the Version constructor will throw an exception (which we do not want) if ( major < 0 ) meta.version = new Version (0, 0); else if ( minor < 0 ) meta.version = new Version (major, 0); else if ( build < 0 ) meta.version = new Version (major, minor); else if ( revision < 0 ) meta.version = new Version (major, minor, build); else meta.version = new Version (major, minor, build, revision); meta.graphs = reader.ReadInt32 (); meta.guids = new string[reader.ReadInt32()]; for ( int i = 0; i < meta.guids.Length; i++ ) meta.guids[i] = reader.ReadString(); meta.typeNames = new string[reader.ReadInt32()]; for ( int i = 0; i < meta.typeNames.Length; i++ ) meta.typeNames[i] = reader.ReadString(); meta.nodeCounts = new int[reader.ReadInt32()]; for ( int i = 0; i < meta.nodeCounts.Length; i++ ) meta.nodeCounts[i] = reader.ReadInt32(); return meta; #endif }
public void OpenSerialize () { // Create a new zip file, here we will store all the data zip = new ZipFile(); zip.AlternateEncoding = System.Text.Encoding.UTF8; zip.AlternateEncodingUsage = ZipOption.Always; #if !ASTAR_NO_JSON // Enqueue some converters so that we can serialize some Unity types writerSettings = new JsonWriterSettings(); writerSettings.AddTypeConverter (new VectorConverter()); writerSettings.AddTypeConverter (new BoundsConverter()); writerSettings.AddTypeConverter (new LayerMaskConverter()); writerSettings.AddTypeConverter (new MatrixConverter()); writerSettings.AddTypeConverter (new GuidConverter()); writerSettings.AddTypeConverter (new UnityObjectConverter()); writerSettings.PrettyPrint = settings.prettyPrint; #endif meta = new GraphMeta(); }