2013-03-26 38 views
6

Json.net có các chức năng async để chuyển đổi một đối tượng để json như:Json.net Async khi viết vào File

jsn = await JsonConvert.DeserializeObjectAsync<T> 

Nhưng khi tôi muốn writea đối tượng để một json nộp có vẻ như tốt hơn để tôi làm trực tiếp bằng cách sử dụng một tập tin Stream.

Vì vậy, tôi nghĩ rằng nó phải là một cái gì đó như thế này:

var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite); 

    using (IOutputStream outputStream = fileStream.GetOutputStreamAt(0)) 
    { 
     using (StreamWriter sw = new StreamWriter(fileStream.AsStreamForWrite())) 
     { 
      using (JsonWriter jw = new JsonTextWriter(sw)) 
      { 
       jw.Formatting = Formatting.Indented; 

       JsonSerializer serializer = new JsonSerializer(); 
       serializer.Serialize(jw, obj); 
      } 
     } 

Nhưng trên Object JsonSerzializer tôi không thể tìm thấy phương pháp async. Ngoài ra tôi nghĩ rằng các hoạt động IO không nên được đặt trong một chủ đề riêng.

Phương pháp được đề xuất là gì?

Trả lời

9

Json.NET không thực sự hỗ trợ de-/serialization không đồng bộ. Các phương thức không đồng bộ trên JsonConvert chỉ là trình bao bọc trên các phương thức đồng bộ chạy chúng trên một luồng khác (which is exactly what a library shouldn't do).

Tôi nghĩ cách tiếp cận tốt nhất ở đây là chạy mã truy cập tệp trên một chuỗi khác. Điều này sẽ không cung cấp cho bạn những lợi thế đầy đủ của async (nó sẽ lãng phí một sợi), nhưng nó sẽ không chặn chuỗi giao diện người dùng.

+0

Cảm ơn đã chỉ ra rằng. Tôi đã tự hỏi làm thế nào một stringoperation có thể là không đồng bộ không ren .. Streaming có thể được thực hiện không đồng bộ. Có lẽ đó sẽ là một tính năng cho Json.net nhưng rõ ràng nó chưa được ngụ ý. Vì vậy, Cảm ơn câu trả lời của bạn. –

+0

Đây sẽ là một nhiệm vụ đơn giản để hoàn thành - tạo một nhánh không đồng bộ của JSON.Net. Vấn đề là, nó sẽ mất một thời gian dài - bất cứ ai có khoảng 80 giờ để rảnh rỗi? nếu không hơn? – Todd

4

Xem thêm mã này, sử dụng đúng cách không đồng bộ (ví dụ: nó sẽ không tạo mảng byte lớn để tránh phân bổ bộ nhớ LOH, nó sẽ không chờ hoàn thành thao tác IO).

using (var file = File.Open(destination, FileMode.Create)) 
{ 
    using (var memoryStream = new MemoryStream()) 
    { 
     using (var writer = new StreamWriter(memoryStream)) 
     { 
      var serializer = JsonSerializer.CreateDefault(); 

      serializer.Serialize(writer, data); 

      await writer.FlushAsync().ConfigureAwait(false); 

      memoryStream.Seek(0, SeekOrigin.Begin); 

      await memoryStream.CopyToAsync(file).ConfigureAwait(false); 
     } 
    } 

    await file.FlushAsync().ConfigureAwait(false); 
} 

Tổng số file: https://github.com/imanushin/AsyncIOComparison/blob/0e2527d5c00c2465e8fd2617ed8bcb1abb529436/IntermediateData/FileNames.cs

+1

IMHO, câu trả lời này là tốt hơn so với câu trả lời được chấp nhận, xem xét câu trả lời chấp nhận hoàn toàn bỏ qua thực tế người dùng đã cố gắng để thực hiện IO và cung cấp không có ví dụ thực sự. –

Các vấn đề liên quan