Skip to content

Commit cd5a3bd

Browse files
committed
support SerializedFile level Serialization
1 parent e3f08f9 commit cd5a3bd

18 files changed

Lines changed: 114 additions & 105 deletions

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ Only support Unity 2017.x or later.
1616
### BundleFile
1717

1818
- [x] Parsing and Reading
19-
- [ ] ~~Serialization~~ (Temporarily removed, will be re-introduced with a new API in a future version)
19+
- [x] Serialization
2020
- [ ] ~~Patching~~ (Will be re-introduced in a future version)
2121
- [ ] Calculate/Patch crc32
2222

2323
### SerializedFile
2424

2525
- [x] Parsing and Reading
26-
- [ ] ~~Serialization~~ (Temporarily removed)
26+
- [x] Serialization
2727
- [ ] ~~Patching~~ (Temporarily removed)
2828

2929
### Asset

UnityAsset.NET/Asset.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class Asset : IEquatable<Asset>
1313
private readonly Lock _lock = new();
1414
public bool IsNamedAsset;
1515

16-
private AssetReader DataReader
16+
public AssetReader DataReader
1717
{
1818
get
1919
{

UnityAsset.NET/Files/BundleFiles/BlocksAndDirectoryInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ public BlocksAndDirectoryInfo(
2828
public void Serialize(IWriter writer)
2929
{
3030
writer.WriteBytes(UncompressedDataHash);
31-
writer.WriteArray(BlocksInfo, (w, info) => info.Serialize(w));
32-
writer.WriteArray(DirectoryInfo, (w, info) => info.Serialize(w));
31+
writer.WriteArrayWithCount(BlocksInfo, (w, info) => info.Serialize(w));
32+
writer.WriteArrayWithCount(DirectoryInfo, (w, info) => info.Serialize(w));
3333
}
3434

3535
public override string ToString()

UnityAsset.NET/Files/BundleFiles/BundleFile.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ public void Serialize(Stream output, bool leaveOpen = false, CompressionType inf
173173
ulong offset = 0;
174174
foreach (var file in Files.AsReadOnlySpan())
175175
{
176+
blockWriter.SetAlignBegin();
176177
ulong cabSize;
177178
switch (file.File)
178179
{
@@ -181,12 +182,10 @@ public void Serialize(Stream output, bool leaveOpen = false, CompressionType inf
181182
cabSize = blockWriter.WriteBytes(reader);
182183
break;
183184
case SerializedFile sf:
184-
throw new NotImplementedException();
185-
/*MemoryBinaryIO sfBuffer = new MemoryBinaryIO((int)sf.SerializeSize);
186-
sf.Serialize(sfBuffer);
187-
cabSize = (int)sfBuffer.Position;
188-
writer.WriteBytes(sfBuffer.ReadOnlySlice(0, cabSize));
189-
break;*/
185+
var pos = blockWriter.Position;
186+
sf.Serialize(blockWriter);
187+
cabSize = (ulong)(blockWriter.Position - pos);
188+
break;
190189
default:
191190
throw new Exception($"Unexpected type: {file.File.GetType().Name}");
192191
}

UnityAsset.NET/Files/SerializedFiles/AssetFileInfo.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public static AssetFileInfo Parse(IReader reader, SerializedFileFormatVersion ve
3636
return new AssetFileInfo(pathId, byteOffset, byteSize, typeIdOrIndex, type);
3737
}
3838

39-
/*public void Serialize(IWriter writer, SerializedFileFormatVersion version)
39+
public void Serialize(IWriter writer, SerializedFileFormatVersion version)
4040
{
4141
writer.Align(4);
4242
writer.WriteInt64(PathId);
@@ -48,8 +48,6 @@ public static AssetFileInfo Parse(IReader reader, SerializedFileFormatVersion ve
4848
writer.WriteInt32(TypeIdOrIndex);
4949
}
5050

51-
public long SerializeSize => 28;*/
52-
5351
public override string ToString()
5452
{
5553
StringBuilder sb = new StringBuilder();

UnityAsset.NET/Files/SerializedFiles/AssetPPtr.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,13 @@ public static AssetPPtr Parse(IReader reader)
2222
return new AssetPPtr(fileId, pathId);
2323
}
2424

25-
/*public void Serialize(IWriter writer)
25+
public void Serialize(IWriter writer)
2626
{
2727
writer.WriteInt32(FileId);
2828
writer.Align(4);
2929
writer.WriteInt64(PathId);
3030
}
3131

32-
public long SerializeSize => 16;*/
33-
3432
public override string ToString()
3533
{
3634
StringBuilder sb = new StringBuilder();

UnityAsset.NET/Files/SerializedFiles/AssetsFileExternal.cs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,22 +42,14 @@ public static AssetsFileExternal Parse(IReader reader)
4242
return new AssetsFileExternal(virtualAssetPathName, guid, type, pathName, originalPathName);
4343
}
4444

45-
/*public void Serialize(IWriter writer)
45+
public void Serialize(IWriter writer)
4646
{
4747
writer.WriteNullTerminatedString(VirtualAssetPathName);
4848
Guid.Serialize(writer);
4949
writer.WriteInt32((Int32)Type);
50-
var toWritePathName = PathName;
51-
if ((PathName == "Resources/unity_builtin_extra" ||
52-
PathName == "Resources/unity default resources" ||
53-
PathName == "Resources/unity editor resources")
54-
&& OriginalPathName != string.Empty)
55-
toWritePathName = OriginalPathName;
56-
writer.WriteNullTerminatedString(toWritePathName);
57-
}*/
50+
writer.WriteNullTerminatedString(OriginalPathName);
51+
}
5852

59-
public long SerializeSize => 22 + VirtualAssetPathName.Length + Math.Max(OriginalPathName.Length, PathName.Length);
60-
6153
public override string ToString()
6254
{
6355
StringBuilder sb = new StringBuilder();

UnityAsset.NET/Files/SerializedFiles/GUID128.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,13 @@ private static uint LiteralToHex(char c)
123123
};
124124
}
125125

126-
/*public void Serialize(IWriter writer)
126+
public void Serialize(IWriter writer)
127127
{
128128
writer.WriteUInt32(data0);
129129
writer.WriteUInt32(data1);
130130
writer.WriteUInt32(data2);
131131
writer.WriteUInt32(data3);
132-
}*/
132+
}
133133

134134
public long SerializeSize => 16;
135135
}

UnityAsset.NET/Files/SerializedFiles/Hash128.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,5 @@ public override int GetHashCode()
6464
return BitConverter.ToInt32(data, 0);
6565
}
6666

67-
//public void Serialize(IWriter writer) => writer.WriteBytes(data);
67+
public void Serialize(IWriter writer) => writer.WriteBytes(data);
6868
}

UnityAsset.NET/Files/SerializedFiles/SerializedFile.cs

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using UnityAsset.NET.FileSystem;
33
using UnityAsset.NET.IO;
44
using UnityAsset.NET.IO.Reader;
5+
using UnityAsset.NET.IO.Writer;
56

67
namespace UnityAsset.NET.Files.SerializedFiles;
78

@@ -84,37 +85,34 @@ public void Process()
8485
}
8586
}
8687

87-
/*public void Serialize(IWriter writer)
88+
public void Serialize(IWriter writer)
8889
{
89-
if (writer is MemoryBinaryIO mbio)
90-
mbio.EnsureCapacity((int)SerializeSize);
90+
var pos = writer.Position;
9191
Header.Serialize(writer);
9292
writer.Endian = Header.Endianness;
9393
Metadata.Serialize(writer, Header.Version);
94-
writer.Seek((int)Header.DataOffset);
95-
var assetsSpan = Assets.AsSpan();
96-
assetsSpan.Sort((a, b) => a.Info.ByteOffset.CompareTo(b.Info.ByteOffset));
97-
foreach (var asset in assetsSpan)
94+
var assets = new List<Asset>(Assets);
95+
assets.Sort((a, b) => a.Info.ByteOffset.CompareTo(b.Info.ByteOffset));
96+
foreach (var asset in assets)
9897
{
99-
writer.Seek((int)(Header.DataOffset + asset.Info.ByteOffset));
100-
asset.RawData.Position = 0;
101-
writer.WriteBytes(asset.RawData.ReadBytes((int)asset.RawData.Length));
98+
var assetOffset = Header.DataOffset + asset.Info.ByteOffset;
99+
var bytesToSkip = (ulong)pos + assetOffset - (ulong)writer.Position;
100+
writer.WriteBytes(0, bytesToSkip);
101+
writer.WriteBytes(asset.DataReader);
102102
}
103103
}
104104

105-
public void Serialize(string path)
105+
public void Serialize(Stream output, bool leaveOpen = true)
106106
{
107-
using FileStreamWriter fsw = new FileStreamWriter(path);
108-
Serialize(fsw);
107+
using var writer = new CustomStreamWriter(output, leaveOpen: leaveOpen);
108+
Serialize(writer);
109109
}
110-
111-
public long SerializeSize
110+
111+
public void Serialize(string path)
112112
{
113-
get {
114-
var lastAssetInfo = Metadata.AssetInfos.MaxBy(info => info.ByteOffset);
115-
return (long)(Header.DataOffset + lastAssetInfo.ByteOffset + lastAssetInfo.ByteSize);
116-
}
117-
}*/
113+
using var output = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None);
114+
Serialize(output, false);
115+
}
118116

119117
public override string ToString()
120118
{

0 commit comments

Comments
 (0)