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

使用.NET读取QLDB Kinesis流时遇Amazon.IonDotnet无效令牌异常

解决方案

核心问题定位

你遇到的InvalidTokenException是因为错误地用文本Ion加载器解析了二进制Ion数据。QLDB流式传输到Kinesis的默认格式是二进制Ion,而IonLoader.Default.Load()是用于解析文本格式Ion的工具,将二进制字节直接当作文本解析时,会出现无法识别的字节序列,生成Unicode替换字符(U+FFFD,即�),最终触发该错误。

修复步骤

  1. 改用二进制Ion读取器解析数据
    替换原有的IonLoader.Default.Load(record.Data)逻辑,使用IonReaderBuilder构建二进制Ion读取器:

    using System.IO;
    using Amazon.IonDotnet;
    using Amazon.IonDotnet.Builders;
    
    // 处理Kinesis记录的代码
    var dataStream = new MemoryStream(record.Data);
    using (var ionReader = IonReaderBuilder.Build(dataStream))
    {
        while (ionReader.MoveNext())
        {
            // 根据Ion节点类型处理数据
            switch (ionReader.Type)
            {
                case IonType.Struct:
                    // 处理结构体数据逻辑
                    break;
                // 其他节点类型的处理逻辑
            }
        }
    }
    
  2. 验证QLDB流的输出格式配置
    确认QLDB流的输出格式为ION_BINARY(默认配置),如果误配置为ION_TEXT,需调整:

    • 登录AWS控制台,进入QLDB流配置页面,查看"Output format"选项
    • 若使用基础设施即代码(如CloudFormation/CDK),检查OutputFormat参数是否设置为ION_BINARY
  3. 异常时记录字节数据用于排查
    为了彻底定位偶发的异常,可在捕获异常时将record.Data转为十六进制字符串记录,排查是否存在固定的字节损坏模式:

    try
    {
        // 原解析逻辑
    }
    catch (InvalidTokenException ex)
    {
        var hexData = BitConverter.ToString(record.Data).Replace("-", "");
        // 将hexData和异常信息记录到日志系统
    }
    
  4. 若为文本Ion格式的兼容处理
    若确认QLDB流输出的是文本Ion,需确保用UTF-8编码读取:

    var ionText = System.Text.Encoding.UTF8.GetString(record.Data);
    using (var ionReader = IonReaderBuilder.Build(ionText))
    {
        // 处理文本Ion数据的逻辑
    }
    

内容的提问来源于stack exchange,提问作者Arda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:03:13