public void save(Stream os) { // write database file try { DataWriter outw = new DataWriter(os, Encoding.ASCII); // write header outw.writeInt(FILE_FORMAT); // create node writer VersionInfo versionInfo = new VersionInfo(); versionInfo.assetVersion = NODE_FORMAT; TypeNodeWriter nodeWriter = new TypeNodeWriter(versionInfo); // write field node table List <TypeNode> nodesTmp = new List <TypeNode>(new HashSet <TypeNode>(getNodeSet())); outw.writeInt(nodesTmp.Count); foreach (TypeNode typeNode in nodesTmp) { nodeWriter.write(outw, typeNode); } // write version string table List <UnityVersion> versionsTmp = new List <UnityVersion>(new HashSet <UnityVersion>(getVersionSet())); outw.writeInt(versionsTmp.Count); foreach (UnityVersion version in versionsTmp) { outw.writeStringNull(version.ToString()); } // write mapping data outw.writeInt(entries.Count); foreach (TypeTreeDatabaseEntry entry in entries) { UnityClass unityClass = entry.unityClass; UnityVersion unityVersion = entry.unityVersion; TypeNode node = entry.typeNode; int nodeIndex = nodesTmp.IndexOf(node); int classID = unityClass.ID(); int versionIndex = versionsTmp.IndexOf(unityVersion); outw.writeInt(nodeIndex); outw.writeInt(classID); outw.writeInt(versionIndex); } } catch (IOException ex) { Logger.Log("Can't write type database" + ex); } }
public static int learnTypes(AssetFileEx asset) { if (asset.isStandalone()) { Logger.Log("File doesn't contain type information"); return(0); } Dictionary <int, EmbeddedTypeInfo> typemap = asset.embeddedTypeMap; UnityVersion unityRevision = asset.versionInfo.unityRevision; if (unityRevision == null) { Logger.Log("unityRevision = null"); return(0); } int learned = 0; // merge the TypeTree map with the database field map foreach (KeyValuePair <int, EmbeddedTypeInfo> typeTreeEntry in typemap) { int typeID = typeTreeEntry.Key; TypeNode typeNode = typeTreeEntry.Value.typeTree; // skip MonoBehaviour types if (typeID < 1) { continue; } UnityClass unityClass = new UnityClass(typeID); TypeNode typeNodeDB = TypeTreeUtils.getTypeNode(unityClass, unityRevision, true); if (typeNodeDB == null) { Logger.Log("New: {0}" + unityClass); TypeTreeDatabase.Instance.addEntry(unityClass, unityRevision, typeNode); typeNodeDB = typeNode; learned++; } // check the hashes, they must be identical at this point //int hash1 = typeNode.hashCode(); //int hash2 = typeNodeDB.hashCode(); //if (hash1 != hash2) //{ // Logger.Log("Database hash mismatch for {0}: {1} != {2}"+ // new Object[] {typeNodeDB.type.typeName(), hash1, hash2}); //} // check if the class name is known and suggest the type base name if not if (unityClass.name() == null) { Logger.Log("Unknown ClassID {0}, suggested name: {1}" + new Object[] { unityClass.ID(), typeNode.type }); } } return(learned); }