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;
            }
        }
Example #2
0
        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;
                }
            }
        }
Example #3
0
        public void Serialize(BinaryWriter writer)
        {
            writer.Write((uint)Count);

            foreach (var element in this)
            {
                RTTI.SerializeType(writer, element);
            }
        }