コード例 #1
0
        public static void JsonToBion(string jsonPath, string bionPath, string toDictionaryPath = null)
        {
            using (WordCompressor compressor = (String.IsNullOrEmpty(toDictionaryPath) ? null : WordCompressor.OpenWrite(toDictionaryPath)))
            {
                string toPath = (compressor == null ? bionPath : Path.ChangeExtension(bionPath, ".preopt.bion"));

                using (JsonTextReader reader = new JsonTextReader(new StreamReader(jsonPath)))
                    using (BionWriter writer = new BionWriter(File.Create(toPath), compressor: compressor))
                    {
                        JsonToBion(reader, writer);
                    }

                if (compressor != null)
                {
                    string containerIndexPath = Path.ChangeExtension(bionPath, ".cdx");
                    string searchIndexPath    = Path.ChangeExtension(bionPath, ".idx");

                    using (BionReader reader = new BionReader(File.OpenRead(toPath), compressor: compressor))
                        using (BufferedWriter writer = new BufferedWriter(File.Create(bionPath)))
                        {
                            reader.RewriteOptimized(writer, containerIndexPath, searchIndexPath);
                        }

                    File.Delete(toPath);

                    // :/ Rewrite compressor; pre-optimize pass calls Dispose which writes it too early.
                    compressor.Write(File.OpenWrite(toDictionaryPath));
                }
            }
        }
コード例 #2
0
        private static void RoundTrip(Action <BionWriter> write, Action <BionReader> readAndVerify)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                // Write desired value(s) without closing stream
                using (BionWriter writer = new BionWriter(new BufferedWriter(stream)
                {
                    CloseStream = false
                }))
                {
                    write(writer);
                }

                // Track position and seek back
                long length = stream.Position;
                stream.Seek(0, SeekOrigin.Begin);

                // Read, verify, validate position and no more content
                using (BionReader reader = new BionReader(new BufferedReader(stream)
                {
                    CloseStream = false
                }))
                {
                    readAndVerify(reader);

                    Assert.AreEqual(length, reader.BytesRead);
                    Assert.IsFalse(reader.Read());
                }
            }
        }
コード例 #3
0
 public void Write(Stream stream)
 {
     using (BionWriter writer = new BionWriter(stream))
     {
         Write(writer);
     }
 }
コード例 #4
0
        public static void WriteToken(JsonTextReader reader, BionWriter writer)
        {
            switch (reader.TokenType)
            {
            case JsonToken.StartObject:
                writer.WriteStartObject();
                break;

            case JsonToken.StartArray:
                writer.WriteStartArray();
                break;

            case JsonToken.EndObject:
                writer.WriteEndObject();
                break;

            case JsonToken.EndArray:
                writer.WriteEndArray();
                break;

            case JsonToken.PropertyName:
                writer.WritePropertyName((string)reader.Value);
                break;

            case JsonToken.String:
                string value = (string)reader.Value;
                writer.WriteValue(value);
                break;

            case JsonToken.Integer:
                writer.WriteValue((long)reader.Value);
                break;

            case JsonToken.Boolean:
                writer.WriteValue((bool)reader.Value);
                break;

            case JsonToken.Null:
                writer.WriteNull();
                break;

            case JsonToken.Float:
                writer.WriteValue((double)reader.Value);
                break;

            case JsonToken.Date:
                writer.WriteValue(((DateTime)reader.Value).ToString("yyyy-MM-ddThh:mm:ss.FFFFFFFZ"));
                break;

            case JsonToken.Comment:
                // Nothing Written
                break;

            default:
                throw new NotImplementedException($"JsonToBion not implemented for {reader.TokenType} @({reader.LineNumber}, {reader.LinePosition}).");
            }
        }
コード例 #5
0
        public void Write(BionWriter writer)
        {
            writer.WriteStartArray();
            writer.WriteValue(Count);

            for (int i = 0; i < Count; ++i)
            {
                writer.WriteValue(Words[i]);
                writer.WriteValue(Counts[i]);
            }
            writer.WriteEndArray();
        }
コード例 #6
0
        public static void JsonToBion(JsonTextReader reader, BionWriter writer)
        {
            // 6.0s
            //while (reader.Read())
            //{
            //    WriteToken(reader, writer);
            //}

            // 7.1s
            using (BionDataWriter dataWriter = new BionDataWriter(writer))
            {
                dataWriter.WriteToken(reader);
            }
        }
コード例 #7
0
 public BionDataWriter(Stream stream)
 {
     _writer = new BionWriter(stream);
 }
コード例 #8
0
 public BionDataWriter(BionWriter writer)
 {
     _writer = writer;
 }
コード例 #9
0
 public override void Close()
 {
     _writer?.Dispose();
     _writer = null;
 }
コード例 #10
0
 private void Write(BionWriter writer)
 {
     _words.Write(writer);
 }