|
2 | 2 | using UnityAsset.NET.FileSystem; |
3 | 3 | using UnityAsset.NET.IO; |
4 | 4 | using UnityAsset.NET.IO.Reader; |
| 5 | +using UnityAsset.NET.IO.Writer; |
5 | 6 |
|
6 | 7 | namespace UnityAsset.NET.Files.SerializedFiles; |
7 | 8 |
|
@@ -84,37 +85,34 @@ public void Process() |
84 | 85 | } |
85 | 86 | } |
86 | 87 |
|
87 | | - /*public void Serialize(IWriter writer) |
| 88 | + public void Serialize(IWriter writer) |
88 | 89 | { |
89 | | - if (writer is MemoryBinaryIO mbio) |
90 | | - mbio.EnsureCapacity((int)SerializeSize); |
| 90 | + var pos = writer.Position; |
91 | 91 | Header.Serialize(writer); |
92 | 92 | writer.Endian = Header.Endianness; |
93 | 93 | 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) |
98 | 97 | { |
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); |
102 | 102 | } |
103 | 103 | } |
104 | 104 |
|
105 | | - public void Serialize(string path) |
| 105 | + public void Serialize(Stream output, bool leaveOpen = true) |
106 | 106 | { |
107 | | - using FileStreamWriter fsw = new FileStreamWriter(path); |
108 | | - Serialize(fsw); |
| 107 | + using var writer = new CustomStreamWriter(output, leaveOpen: leaveOpen); |
| 108 | + Serialize(writer); |
109 | 109 | } |
110 | | -
|
111 | | - public long SerializeSize |
| 110 | + |
| 111 | + public void Serialize(string path) |
112 | 112 | { |
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 | + } |
118 | 116 |
|
119 | 117 | public override string ToString() |
120 | 118 | { |
|
0 commit comments