You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:30:58