如何使用System.Text.Json实现流序列化及反序列化操作
System.Text.Json 序列化与反序列化到 MemoryStream 示例
基础准备
首先定义测试用的实体类:
public class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public DateTime RegisterTime { get; set; } }
序列化到 MemoryStream 实现
同步版本
using System.Text.Json; using System.IO; // 初始化待序列化对象 var person = new Person { Id = 1, Name = "张三", Age = 28, RegisterTime = DateTime.Now }; // 序列化配置可选,可根据需求调整 var serializeOptions = new JsonSerializerOptions { WriteIndented = true, // 格式化输出JSON Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping // 解决中文转义乱码问题 }; using var memoryStream = new MemoryStream(); // 直接序列化写入流,无需中转字符串 JsonSerializer.Serialize(memoryStream, person, serializeOptions); // 若需要获取流中的JSON字符串,重置流位置后读取即可 memoryStream.Position = 0; using var streamReader = new StreamReader(memoryStream); string jsonStr = streamReader.ReadToEnd(); Console.WriteLine(jsonStr);
异步版本(推荐IO场景使用)
using var memoryStream = new MemoryStream(); await JsonSerializer.SerializeAsync(memoryStream, person, serializeOptions); // 读取字符串示例 memoryStream.Position = 0; string jsonStr = await new StreamReader(memoryStream).ReadToEndAsync();
从 MemoryStream 反序列化实现
同步版本
// 接上文序列化生成的memoryStream,首先重置流位置到起始点 memoryStream.Position = 0; var deserializeOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true // 忽略属性名大小写匹配 }; var deserializedPerson = JsonSerializer.Deserialize<Person>(memoryStream, deserializeOptions); Console.WriteLine($"反序列化结果:Id={deserializedPerson.Id}, Name={deserializedPerson.Name}");
异步版本
memoryStream.Position = 0; var deserializedPerson = await JsonSerializer.DeserializeAsync<Person>(memoryStream, deserializeOptions);
注意事项
- 流读写操作前务必确认
Position属性值是否处于正确位置,避免读取到空内容 - 若自定义了序列化规则,需保证序列化和反序列化两端的
JsonSerializerOptions配置一致,避免反序列化失败
内容的提问来源于stack exchange,提问作者user6656240
相关产品推荐
相关产品推荐

