/// <summary> /// Serializes file data to a stream. /// </summary> protected override void Write(BinaryWriterEx bw) { bw.BigEndian = BigEndian; bw.VarintLong = LongFormat; bw.WriteInt32(1); bw.WriteInt32(0); bw.WriteInt32(Entries.Count); bw.ReserveInt32("StringsLength"); bw.WriteBoolean(BigEndian); bw.WriteByte(0); bw.WriteByte(0); bw.WriteByte(0); bw.WriteInt32(LongFormat ? 0x28 : 0x1C); bw.WritePattern(0x24, 0x00); long stringsStart = bw.Position; var stringOffsets = new List <long>(Entries.Count * 2); foreach (Entry entry in Entries) { long partNameOffset = bw.Position - stringsStart; stringOffsets.Add(partNameOffset); bw.WriteUTF16(entry.PartName, true); bw.PadRelative(stringsStart, 8); // This padding is not consistent, but it's the best I can do long materialNameOffset = bw.Position - stringsStart; stringOffsets.Add(materialNameOffset); bw.WriteUTF16(entry.MaterialName, true); bw.PadRelative(stringsStart, 8); } bw.FillInt32("StringsLength", (int)(bw.Position - stringsStart)); for (int i = 0; i < Entries.Count; i++) { Entries[i].Write(bw, stringOffsets[i * 2], stringOffsets[i * 2 + 1]); } }