ASP.NET Core中C#如何将MemoryStream转换为StreamContent数组?
解决MemoryStream与StreamContent列表互转的问题
你原来的代码逻辑完全错误——直接将List<StreamContent>转换为单个字节写入流,这会彻底丢失所有StreamContent的实际内容;读取时用StreamReader按行读取也无法还原出StreamContent对象。
可行的实现思路是:逐个提取每个StreamContent内部的字节数据,按固定规则写入MemoryStream;读取时再按相同规则解析字节数据,重新包装为StreamContent。
1. 将List序列化到MemoryStream
public static async Task<MemoryStream> SerializeStreamContentList(List<StreamContent> contentList) { var ms = new MemoryStream(); using (var writer = new BinaryWriter(ms, Encoding.UTF8, leaveOpen: true)) { // 先写入列表元素总数,方便读取时确定循环次数 writer.Write(contentList.Count); foreach (var content in contentList) { // 提取当前StreamContent的内容到字节数组 using (var contentMs = new MemoryStream()) { await content.CopyToAsync(contentMs); contentMs.Position = 0; var contentBytes = contentMs.ToArray(); // 先写入当前内容的字节长度,再写入字节数据本身 writer.Write(contentBytes.Length); writer.Write(contentBytes); } } } ms.Position = 0; return ms; }
2. 从MemoryStream反序列化回List
public static List<StreamContent> DeserializeStreamContentList(MemoryStream ms) { var contentList = new List<StreamContent>(); ms.Position = 0; using (var reader = new BinaryReader(ms, Encoding.UTF8, leaveOpen: true)) { // 读取列表元素总数 int count = reader.ReadInt32(); for (int i = 0; i < count; i++) { // 读取当前内容的字节长度 int byteLength = reader.ReadInt32(); // 读取对应长度的字节数据 var contentBytes = reader.ReadBytes(byteLength); // 将字节数组转为MemoryStream,包装成StreamContent var contentMs = new MemoryStream(contentBytes); var streamContent = new StreamContent(contentMs); contentList.Add(streamContent); } } return contentList; }
补充说明
- 代码用
BinaryWriter/BinaryReader保证数据读写的一致性,通过"元素总数→单个内容字节长度→内容字节"的顺序存储,避免解析出错。 - 如果需要保留StreamContent的Headers等额外信息,可以在序列化时额外写入Headers的键值对,反序列化时重新赋值给新的StreamContent对象。
内容的提问来源于stack exchange,提问作者F205
相关产品推荐
相关产品推荐

