public void Deserialize(Stream input)
        {
            var magic = input.ReadValueU32(Endian.Little);

            if (magic != _Signature)
            {
                throw new FormatException("invalid header magic");
            }
            var endian = Endian.Little;

            var version = input.ReadValueU16(endian);

            if (version != 3)
            {
                throw new FormatException("unsupported file version");
            }

            var flags = input.ReadValueEnum <HeaderFlags>(endian);

            if (flags != HeaderFlags.None)
            {
                throw new FormatException("unsupported file flags");
            }

            var totalObjectCount = input.ReadValueU32(endian);
            var totalValueCount  = input.ReadValueU32(endian);

            var pointers = new List <BinaryObject>();

            this.Version = version;
            this.Flags   = flags;
            this.Root    = BinaryObject.Deserialize(null, input, pointers, endian);
        }
Beispiel #2
0
        public static BinaryObject Deserialize(BinaryObject parent,
                                               Stream input,
                                               List <BinaryObject> pointers,
                                               Endian endian)
        {
            long position = input.Position;

            bool isOffset;
            var  childCount = ReadCount(input, out isOffset, endian);

            if (isOffset == true)
            {
                return(pointers[(int)childCount]);
            }

            var child = new BinaryObject();

            child.Position = position;
            pointers.Add(child);

            child.Deserialize(input, childCount, pointers, endian);
            return(child);
        }
        public void Deserialize(Stream input)
        {
            /*
             * var magic = input.ReadValueU32(Endian.Little);
             * var endian = Endian.Little;
             *
             * Console.WriteLine("0");
             *
             * if (magic != _Signature)
             * {
             *  magic = input.ReadValueU32(Endian.Big);
             *
             *  if (magic == _Signature)
             *  {
             *      Console.WriteLine("1A");
             *      endian = Endian.Big;
             *  }
             *  else
             *  {
             *      Console.WriteLine("1B");
             *      //throw new FormatException("invalid header magic");
             *  }
             * }
             *
             * var version = input.ReadValueU16(endian);
             *
             * if (version != 3)
             * {
             *  Console.WriteLine("2");
             *  //throw new FormatException("unsupported file version");
             * }
             *
             * var flags = input.ReadValueEnum<HeaderFlags>(endian);
             *
             * if (flags != HeaderFlags.None)
             * {
             *  Console.WriteLine("3");
             *  //throw new FormatException("unsupported file flags");
             * }
             *
             * Console.Write($"\nFile info:\n\tMagic = {magic:X8}\n\tVersion = {version}\n\tFlags = {flags}\n");
             */


            var endian = Endian.Little;

            // store header, read magic
            uint   magic       = input.ReadValueU32(endian);
            long   magicOffset = 0;
            string header      = "";

            if (magic != _Signature)
            {
                Utility.Log("Reading header...");

                while (magicOffset == 0)
                {
                    var latest = input.ReadValueU32();

                    if (latest == _Signature)
                    {
                        magicOffset = input.Position - 4;

                        Utility.Log("Signature found!");

                        break;
                    }
                }

                header = GetHeaderString(input, magicOffset);

                input.Position = magicOffset;
                magic          = input.ReadValueU32(endian);

                Utility.Log("Done!");
            }

            // store version
            var version = input.ReadValueU16(endian);

            // everything else
            var flags = input.ReadValueEnum <HeaderFlags>(endian);

            var totalObjectCount = input.ReadValueU32(endian);
            var totalValueCount  = input.ReadValueU32(endian);

            var pointers = new List <BinaryObject>();

            //Console.ForegroundColor = ConsoleColor.DarkGray;
            //Console.Write($"Magic: {magic:X8}\nVersion: {version:X4}\nFlags: {flags}\nHeader Length: {header.Length / 2}\n\n");
            //Console.ResetColor();

            this.Header  = header;
            this.Version = version;
            this.Flags   = flags;
            this.Root    = BinaryObject.Deserialize(null, input, pointers, endian);
        }