public void ToBinary(BinaryWriter bw, AssetIndexBase obj)
        {
#if PROFILING
            Profiler.BeginSample();
#endif
            var stringMap = new StringMap();
            var resourceGroupInfoSerializer = new ResourceGroupInfoSerializerV2(stringMap);
            var resourceBasicInfoSerializer = new ResourceBasicInfoSerializerV2(stringMap);
            var assetInfoSerializer         = new AssetInfoSerializerV2(stringMap);
            var resourceInfoSerializer      = new ResourceInfoSerializerV2(stringMap);

            bw.Write(obj.Header);
            bw.Write(Version);

            obj.SerializeAugmentedData(bw);

            foreach (var kv in obj.ResourceBasicInfos)
            {
                stringMap.TryAddString(kv.Key, out _);
            }

            // AssetInfos doesn't necessarily contain information about all the assets. So their dependency paths have to
            // be added into stringMap.
            foreach (var kv in obj.AssetInfos)
            {
                stringMap.TryAddString(kv.Key, out _);
                foreach (var dependencyAssetPath in kv.Value.DependencyAssetPaths)
                {
                    stringMap.TryAddString(dependencyAssetPath, out _);
                }
            }

            stringMap.ToBinary(bw);

            bw.Write(obj.ResourceGroupInfos.Count);
            foreach (var resourceGroupInfo in obj.ResourceGroupInfos)
            {
                resourceGroupInfoSerializer.ToBinary(bw, resourceGroupInfo);
            }

            bw.Write(obj.ResourceBasicInfos.Count);
            foreach (var kv in obj.ResourceBasicInfos)
            {
                resourceBasicInfoSerializer.ToBinary(bw, kv.Value);
            }

            bw.Write(obj.AssetInfos.Count);
            foreach (var kv in obj.AssetInfos)
            {
                assetInfoSerializer.ToBinary(bw, kv.Value);
            }

            bw.Write(obj.ResourceInfos.Count);
            foreach (var kv in obj.ResourceInfos)
            {
                resourceInfoSerializer.ToBinary(bw, kv.Value);
            }
#if PROFILING
            InternalLog.Debug($"[AssetIndexSerializerV2 ToBinary] Serialization of asset index takes {Profiler.EndSample().TotalMilliseconds} ms.");
#endif
        }