public void load(Stream fs) { try { DataReader inr = new DataReader(fs, Encoding.ASCII); // read header int dbVersion = inr.readInt(); if (dbVersion != FILE_FORMAT) { throw new Exception("Wrong database version"); } // create node reader VersionInfo versionInfo = new VersionInfo(); versionInfo.assetVersion = NODE_FORMAT; TypeNodeReader nodeReader = new TypeNodeReader(versionInfo); // read field node table int fieldNodeSize = inr.readInt(); List <TypeNode> typeNodes = new List <TypeNode>(fieldNodeSize); for (int i = 0; i < fieldNodeSize; i++) { TypeNode node = new TypeNode(versionInfo); nodeReader.read(inr, node); typeNodes.Add(node); } // read version string table int versionSize = inr.readInt(); List <UnityVersion> versionsTmp = new List <UnityVersion>(versionSize); for (int i = 0; i < versionSize; i++) { versionsTmp.Add(new UnityVersion(inr.readStringNull())); } // read mapping data int numEntries = inr.readInt(); for (int i = 0; i < numEntries; i++) { int nodeIndex = inr.readInt(); int classID = inr.readInt(); int versionIndex = inr.readInt(); UnityVersion unityVersion = versionsTmp[versionIndex]; UnityClass unityClass = new UnityClass(classID); TypeNode typeNode = typeNodes[nodeIndex]; addEntry(unityClass, unityVersion, typeNode); } } catch (IOException ex) { Logger.Log("Can't read type database" + ex); } }
//throws IOException public void read(DataReader inr) { // revision/version for newer formats if (versionInfo.assetVersion > 6) { string sver = inr.readStringNull(255); versionInfo.unityRevision = new UnityVersion(sver); attributes = inr.readInt(); } TypeNodeReader nodeReader = new TypeNodeReader(versionInfo); // Unity 5+ uses a serialized tree structure and string buffers if (versionInfo.assetVersion > 13) { embedded = inr.readBoolean(); int numBaseClasses = inr.readInt(); Logger.Log("numBaseClasses=" + numBaseClasses); if (numBaseClasses > 1000) { return; } for (int i = 0; i < numBaseClasses; i++) { int classID = inr.readInt(); EmbeddedTypeInfo embeddedtype = new EmbeddedTypeInfo(); embeddedtype.classID = classID; if (classID < 0) { UnityHash128 scriptID = new UnityHash128(versionInfo); scriptID.read(inr); embeddedtype.scriptID = scriptID; } UnityHash128 oldTypeHash = new UnityHash128(versionInfo); oldTypeHash.read(inr); embeddedtype.oldTypeHash = oldTypeHash; if (embedded) { TypeNode node = new TypeNode(versionInfo); nodeReader.read(inr, node); embeddedtype.typeTree = node; } embeddedTypeMap[classID] = embeddedtype; } } else { int numBaseClasses = inr.readInt(); Logger.Log("numBaseClasses=" + numBaseClasses); for (int i = 0; i < numBaseClasses; i++) { int classID = inr.readInt(); EmbeddedTypeInfo embeddedtype = new EmbeddedTypeInfo(); embeddedtype.classID = classID; TypeNode node = new TypeNode(versionInfo); nodeReader.read(inr, node); embeddedtype.typeTree = node; embeddedTypeMap[classID] = embeddedtype; } embedded = numBaseClasses > 0; // padding if (versionInfo.assetVersion > 6) { inr.readInt(); } } }