public static FileToAssetNode[] Deserialize(byte[] bytes)
        {
            int offset = 0;
            int numFileToAssetNodes = CacheSerializerUtils.DecodeShort(ref bytes, ref offset);

            FileToAssetNode[] fileToAssetNodes = new FileToAssetNode[numFileToAssetNodes];

            for (int n = 0; n < numFileToAssetNodes; ++n)
            {
                string          fileId        = CacheSerializerUtils.DecodeString(ref bytes, ref offset);
                FileToAssetNode fileAssetNode = new FileToAssetNode {
                    FileId = fileId
                };
                int resolverTimeStampLength = CacheSerializerUtils.DecodeShort(ref bytes, ref offset);

                for (var i = 0; i < resolverTimeStampLength; i++)
                {
                    FileToAssetNode.ResolverTimeStamp resolverTimeStamp = new FileToAssetNode.ResolverTimeStamp();
                    resolverTimeStamp.ResolverId = CacheSerializerUtils.DecodeString(ref bytes, ref offset);
                    resolverTimeStamp.TimeStamp  = CacheSerializerUtils.DecodeLong(ref bytes, ref offset);
                    fileAssetNode.ResolverTimeStamps.Add(resolverTimeStamp);
                }

                int numAssetNodes = CacheSerializerUtils.DecodeShort(ref bytes, ref offset);

                for (var i = 0; i < numAssetNodes; i++)
                {
                    string    assetId   = CacheSerializerUtils.DecodeString(ref bytes, ref offset);
                    AssetNode assetNode = new AssetNode(assetId);

                    int numResolverDatas = CacheSerializerUtils.DecodeShort(ref bytes, ref offset);

                    for (int j = 0; j < numResolverDatas; ++j)
                    {
                        AssetNode.ResolverData data = new AssetNode.ResolverData();

                        data.ResolverId   = CacheSerializerUtils.DecodeString(ref bytes, ref offset);
                        data.Dependencies = CacheSerializerUtils.DecodeDependencies(ref bytes, ref offset);

                        assetNode.ResolverDatas.Add(data);
                    }

                    fileAssetNode.AssetNodes.Add(assetNode);
                }

                fileToAssetNodes[n] = fileAssetNode;
            }

            string eof = CacheSerializerUtils.DecodeString(ref bytes, ref offset);

            if (!eof.Equals(EOF))
            {
                Debug.LogError("AssetDependencyCache cache file to be corrupted. Rebuilding cache required");
                return(new FileToAssetNode[0]);
            }

            return(fileToAssetNodes);
        }
        public static FileToAssetsMapping[] Deserialize(byte[] bytes)
        {
            int offset = 0;
            int numAssetToFileNodes = CacheSerializerUtils.DecodeShort(ref bytes, ref offset);

            FileToAssetsMapping[] assetToFileMappings = new FileToAssetsMapping[numAssetToFileNodes];

            for (int n = 0; n < numAssetToFileNodes; ++n)
            {
                FileToAssetsMapping mapping = new FileToAssetsMapping();

                mapping.Timestamp = CacheSerializerUtils.DecodeLong(ref bytes, ref offset);
                mapping.FileId    = CacheSerializerUtils.DecodeString(ref bytes, ref offset);

                int numFileNodes = CacheSerializerUtils.DecodeShort(ref bytes, ref offset);

                mapping.FileNodes = new List <FileToAssetMappingNode>();

                for (int i = 0; i < numFileNodes; ++i)
                {
                    FileToAssetMappingNode fileNode = new FileToAssetMappingNode();

                    fileNode.AssetId      = CacheSerializerUtils.DecodeString(ref bytes, ref offset);
                    fileNode.Dependencies = CacheSerializerUtils.DecodeDependencies(ref bytes, ref offset);

                    mapping.FileNodes.Add(fileNode);
                }

                assetToFileMappings[n] = mapping;
            }

            string eof = CacheSerializerUtils.DecodeString(ref bytes, ref offset);

            if (!eof.Equals(EOF))
            {
                Debug.LogError("AssetToFileDependencyCache cache file to be corrupted. Rebuilding cache required");
                return(new FileToAssetsMapping[0]);
            }

            return(assetToFileMappings);
        }