使用.NET读取QLDB Kinesis流时遇Amazon.IonDotnet无效令牌异常
解决方案
核心问题定位
你遇到的InvalidTokenException是因为错误地用文本Ion加载器解析了二进制Ion数据。QLDB流式传输到Kinesis的默认格式是二进制Ion,而IonLoader.Default.Load()是用于解析文本格式Ion的工具,将二进制字节直接当作文本解析时,会出现无法识别的字节序列,生成Unicode替换字符(U+FFFD,即�),最终触发该错误。
修复步骤
改用二进制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; // 其他节点类型的处理逻辑 } } }验证QLDB流的输出格式配置
确认QLDB流的输出格式为ION_BINARY(默认配置),如果误配置为ION_TEXT,需调整:- 登录AWS控制台,进入QLDB流配置页面,查看"Output format"选项
- 若使用基础设施即代码(如CloudFormation/CDK),检查
OutputFormat参数是否设置为ION_BINARY
异常时记录字节数据用于排查
为了彻底定位偶发的异常,可在捕获异常时将record.Data转为十六进制字符串记录,排查是否存在固定的字节损坏模式:try { // 原解析逻辑 } catch (InvalidTokenException ex) { var hexData = BitConverter.ToString(record.Data).Replace("-", ""); // 将hexData和异常信息记录到日志系统 }若为文本Ion格式的兼容处理
若确认QLDB流输出的是文本Ion,需确保用UTF-8编码读取:var ionText = System.Text.Encoding.UTF8.GetString(record.Data); using (var ionReader = IonReaderBuilder.Build(ionText)) { // 处理文本Ion数据的逻辑 }
内容的提问来源于stack exchange,提问作者Arda
相关产品推荐
相关产品推荐

