Пример #1
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);
        }