Ejemplo n.º 1
0
        static public void LoadHeader(Stream stream, out TKey[] keys, out int[] valueLengths, out byte[] valueBuf)
        {
            // signature 'TBP1' (4 bytes)

            var sigBuf = new byte[4];

            stream.Read(sigBuf, 0, 4);
            if (sigBuf[0] != 0x54 || sigBuf[1] != 0x42 || sigBuf[2] != 0x50 || sigBuf[3] != 0x31)
            {
                throw new FormatException("Signature mismatch");
            }

            // count (4 bytes)

            var countBuf = new byte[4];

            stream.Read(countBuf, 0, 4);
            var count = BitConverter.ToInt32(countBuf, 0);

            // read keys & values

            var keysSizeBuf = new byte[4];

            stream.Read(keysSizeBuf, 0, 4);
            var keysSize = BitConverter.ToInt32(keysSizeBuf, 0);

            var keysBuf = new byte[keysSize];

            stream.Read(keysBuf, 0, keysBuf.Length);

            keys         = new TKey[count];
            valueLengths = new int[count];

            var valueBufSize     = 0;
            var keysStream       = new MemoryStream(keysBuf);
            var keysStreamReader = new BinaryReader(keysStream);

            for (var i = 0; i < count; i++)
            {
                var key         = StreamGenericHelper.Read <TKey>(keysStreamReader);
                var valueLength = keysStreamReader.ReadInt32();

                keys[i]         = key;
                valueLengths[i] = valueLength;

                valueBufSize += valueLength;
            }

            valueBuf = new byte[valueBufSize];
            stream.Read(valueBuf, 0, valueBufSize);
        }
Ejemplo n.º 2
0
        static public void Save(IEnumerable <KeyValuePair <TKey, JToken> > itemList, Stream stream)
        {
            var items = itemList.OrderBy(i => i.Key).ToList();

            // signature 'TBP1' (4 bytes)

            stream.Write(new byte[] { 0x54, 0x42, 0x50, 0x31 }, 0, 4);

            // count (4 bytes)

            var countBuf = BitConverter.GetBytes(items.Count);

            stream.Write(countBuf, 0, countBuf.Length);

            // keys & values

            var keysStream       = new MemoryStream();
            var keysStreamWriter = new BinaryWriter(keysStream);
            var valuesStream     = new MemoryStream();

            foreach (var i in items)
            {
                // serialize value by BsonWriter

                var ms = new MemoryStream(1024);
                using (var writer = new BsonWriter(ms))
                {
                    i.Value.WriteTo(writer);
                }
                var valueBuf = ms.ToArray();

                // serialize key and the length of value stream

                StreamGenericHelper.Write(keysStreamWriter, i.Key);
                keysStreamWriter.Write(valueBuf.Length);

                // copy value buffer to valuesStream

                valuesStream.Write(valueBuf, 0, valueBuf.Length);
            }

            var keysBuf = keysStream.ToArray();

            stream.Write(BitConverter.GetBytes(keysBuf.Length), 0, 4);
            stream.Write(keysBuf, 0, keysBuf.Length);

            var valuesBuf = valuesStream.ToArray();

            stream.Write(valuesBuf, 0, valuesBuf.Length);
        }
        public void SaveTo(TemplateTable <TKey, TValue> table, Stream stream)
        {
            var items = table.ToList();

            items.Sort((x, y) => x.Key.CompareTo(y.Key));

            // signature 'TPP1' (4 bytes)

            stream.Write(new byte[] { 0x54, 0x50, 0x50, 0x31 }, 0, 4);

            // count (4 bytes)

            var countBuf = BitConverter.GetBytes(items.Count);

            stream.Write(countBuf, 0, countBuf.Length);

            // keys & values

            var keysStream       = new MemoryStream();
            var keysStreamWriter = new BinaryWriter(keysStream);
            var valuesStream     = new MemoryStream();

            foreach (var i in items)
            {
                // serialize value by BsonWriter

                var curPos = valuesStream.Position;
                _typeModel.Serialize(valuesStream, i.Value);
                var valueLength = (int)(valuesStream.Position - curPos);

                // serialize key and the length of value stream

                StreamGenericHelper.Write(keysStreamWriter, i.Key);
                keysStreamWriter.Write(valueLength);
            }

            var keysBuf = keysStream.ToArray();

            stream.Write(BitConverter.GetBytes(keysBuf.Length), 0, 4);
            stream.Write(keysBuf, 0, keysBuf.Length);

            var valuesBuf = valuesStream.ToArray();

            stream.Write(valuesBuf, 0, valuesBuf.Length);
        }