示例#1
0
        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);
            }
        }
示例#2
0
        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);
        }