Newtonsoft Json.net - 如何序列化流的内容?

6

本文介绍了Newtonsoft Json.net - 如何序列化流的内容?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

限时送ChatGPT账号..

我需要将内存流转换为 JSON 任意内容.这是我正在尝试做的一个简单示例:

I need to convert to JSON arbitrary content of a memory stream. Here is a quick example of what I am trying to do:

class Program
{
    class TestClass { public int Test1;}
    static void Main(string[] args)
    {
        var ms = new MemoryStream();
        var writer = new StreamWriter(ms);
        writer.Write(new TestClass());
        writer.Flush();
        ms.Position = 0;

        var json = JsonConvert.SerializeObject(/*???*/, Formatting.Indented);
        Console.Write(json);
        Console.Read();
    }
}

不确定将什么传递给 SerializeObject 方法.如果我通过 MemoryStream (variable ms) 我得到一个错误:

Not sure what to pass to the SerializeObject method. If I pass the MemoryStream (variable ms) I get an error:

未处理的类型异常'Newtonsoft.Json.JsonSerializationException' 发生在Newtonsoft.Json.dll

An unhandled exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll

附加信息:从ReadTimeout"获取值时出错'System.IO.MemoryStream'.

Additional information: Error getting value from 'ReadTimeout' on 'System.IO.MemoryStream'.

是否可以序列化流的任意内容?

Is that possible to serialize arbitrary content of a stream ?

谢谢

推荐答案

MemoryStream 内容的序列化和反序列化可以使用转换器实现:

Serializing and deserializing content of a MemoryStream can be achieved using a converter:

public class MemoryStreamJsonConverter : JsonConverter
{
  public override bool CanConvert(Type objectType)
  {
     return typeof(MemoryStream).IsAssignableFrom(objectType);
  }

  public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  {
     var bytes = serializer.Deserialize<byte[]>(reader);
     return bytes != null ? new MemoryStream(bytes) : new MemoryStream();
  }

  public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  {
     var bytes = ((MemoryStream)value).ToArray();
     serializer.Serialize(writer, bytes);
  }
}

那么你的代码可能看起来像这样(我将new TestClass()"更改为Test string"以便于比较 json 序列化和反序列化):

Then your code could look like that (I changed "new TestClass()" to "Test string" for easier comparison of json serialization and deserialization):

private void CheckJsonSerialization()
{
   var ms = new MemoryStream();
   var writer = new StreamWriter(ms);
   writer.WriteLine("Test string");
   writer.Flush();
   ms.Position = 0;

   var json = JsonConvert.SerializeObject(ms, Formatting.Indented, new MemoryStreamJsonConverter());
   var ms2 = JsonConvert.DeserializeObject<MemoryStream>(json, new MemoryStreamJsonConverter());
   var reader = new StreamReader(ms2);
   var deserializedString = reader.ReadLine();

   Console.Write(json);
   Console.Write(deserializedString);
   Console.Read();
}

当 Stream 是序列化对象的属性时,也可以使用这种转换器:

Such converter can be also used when Stream is a property of a serialized object:

  public class ClassToCheckSerialization
  {
     public string StringProperty { get; set; }

     [JsonConverter(typeof(MemoryStreamJsonConverter))]
     public Stream StreamProperty { get; set; }
  }

  private void CheckJsonSerializationOfClass()
  {
     var data = new ClassToCheckSerialization();
     var ms = new MemoryStream();
     const string entryString = "Test string inside stream";
     var sw = new StreamWriter(ms);
     sw.WriteLine(entryString);
     sw.Flush();
     ms.Position = 0;
     data.StreamProperty = ms;
     var json = JsonConvert.SerializeObject(data);

     var result = JsonConvert.DeserializeObject<ClassToCheckSerialization>(json);
     var sr = new StreamReader(result.StreamProperty);
     var stringRead = sr.ReadLine();
     //Assert.AreEqual(entryString, stringRead);
  }

这篇关于Newtonsoft Json.net - 如何序列化流的内容?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

C# 中的多播委托奇怪行为?
Multicast delegate weird behavior in C#?(C# 中的多播委托奇怪行为?)...
2023-11-11 C#/.NET开发问题
6

参数计数与调用不匹配?
Parameter count mismatch with Invoke?(参数计数与调用不匹配?)...
2023-11-11 C#/.NET开发问题
26

如何将代表存储在列表中
How to store delegates in a List(如何将代表存储在列表中)...
2023-11-11 C#/.NET开发问题
6

代表如何工作(在后台)?
How delegates work (in the background)?(代表如何工作(在后台)?)...
2023-11-11 C#/.NET开发问题
5

没有 EndInvoke 的 C# 异步调用?
C# Asynchronous call without EndInvoke?(没有 EndInvoke 的 C# 异步调用?)...
2023-11-11 C#/.NET开发问题
2

Delegate.CreateDelegate() 和泛型:错误绑定到目标方法
Delegate.CreateDelegate() and generics: Error binding to target method(Delegate.CreateDelegate() 和泛型:错误绑定到目标方法)...
2023-11-11 C#/.NET开发问题
14