public void ToData(BinaryWriter writer) { foreach (var entry in Entries) { // Allocate file space for a fake entry with all zeros entry.ChunkOffset = writer.BaseStream.Position; writer.BaseStream.Position += CoreEntry.DataHeaderSize; if (entry.ContainedObject is byte[] asBytes) { // Unsupported (raw data) object type writer.Write(asBytes); } else { RTTI.SerializeType(writer, entry.ContainedObject); } // Now rewrite it with the updated fields entry.ChunkSize = (uint)(writer.BaseStream.Position - entry.ChunkOffset - CoreEntry.DataHeaderSize); long oldPosition = writer.BaseStream.Position; writer.BaseStream.Position = entry.ChunkOffset; RTTI.SerializeType(writer, entry); writer.BaseStream.Position = oldPosition; } }
public static void Save(string filePath, List <object> objects) { using (var writer = new BinaryWriter(File.Open(filePath, FileMode.Create, FileAccess.Write, FileShare.None))) { foreach (var topLevelObject in objects) { // Allocate file space for a fake entry with all zeros var entry = new Entry(); RTTI.SerializeType(writer, entry); if (topLevelObject is byte[] asBytes) { // Handle unsupported (raw data) object types writer.Write(asBytes); } else { RTTI.SerializeType(writer, topLevelObject); } entry.TypeId = RTTI.GetIdByType(topLevelObject.GetType()); entry.ChunkSize = (uint)(writer.BaseStream.Position - entry.ChunkOffset - 12); // Now rewrite it with the updated fields long oldPosition = writer.BaseStream.Position; writer.BaseStream.Position = entry.ChunkOffset; RTTI.SerializeType(writer, entry); writer.BaseStream.Position = oldPosition; } } }
public void Serialize(BinaryWriter writer) { writer.Write((uint)Count); foreach (var element in this) { RTTI.SerializeType(writer, element); } }