0

0

C# AVRO文件读写 C#如何操作Apache Avro数据序列化文件

星降

星降

发布时间:2026-03-11 16:59:22

|

513人浏览过

|

来源于php中文网

原创

使用 avroserializer 写 avro 文件前必须定义 schema,t 需标注 [datacontract]/[datamember],字段类型受限;须用 datafilewriter 写二进制文件,不可文本写入;读取时 schema 必须与写入一致,推荐 apache.avro 而非 confluent.schemaregistry 用于本地文件。

c# avro文件读写 c#如何操作apache avro数据序列化文件

AvroSerializer<t></t> 写 AVRO 文件前,必须先定义 Schema

AVRO 不是“随便序列化对象就行”的格式,Schema 是强制前置条件。C# 里最常用的是 Confluent.SchemaRegistry.Serdes.AvroSerializer<t></t>(配合 Kafka)或纯 AvroConvert + BinaryEncoder(本地文件)。但无论哪种,T 的类型定义必须能映射出完整 Schema —— 比如字段不能是 object,集合得是 IList<t></t>Array,且类需加 [DataContract][DataMember],否则运行时抛 AvroRuntimeException: Cannot resolve type

  • [DataContract] public class Event { [DataMember(Order = 0)] public string Id { get; set; } },不是 public record 或无属性修饰的 class
  • Schema 可显式传入 new AvroSerializer<event>(schemaString)</event>,也可让库自动从类型推导(但要求类型干净、无循环引用)
  • 如果字段是 DateTime,默认映射为 long(毫秒时间戳),要 UTC 语义就得自己处理时区,别指望自动转

File.Create() 后直接写二进制流,别用 StreamWriter

AVRO 文件是二进制容器格式(Object Container File),开头有 16 字节 magic bytes(Obj\x01),后面跟着 Schema、同步标记、数据块。用文本方式写会直接破坏结构,导致后续读取报 InvalidDataException: Not a valid Avro data file

  • 写文件必须用 using var fs = File.Create("data.avro"); using var writer = new BinaryWriter(fs);
  • 推荐用 Avro.File.DataFileWriter<t></t>(来自 Apache.Avro 包),它自动处理 magic、Schema 嵌入和块压缩:
    using var writer = new DataFileWriter<Event>(new FsSyncableOutputStream("data.avro")); writer.SetCodec(Codec.Null); writer.Append(new Event { Id = "abc" }); writer.Close();
  • 别手动拼接 Schema JSON 字符串再写进文件——DataFileWriter 会把它序列化成二进制并写在文件头,你只管 Append 数据

DataFileReader<t></t> 时,Schema 必须和写入时一致

AVRO 读取不依赖运行时类型反射,而是靠文件内嵌 Schema 和你传入的 T 类型做字段名/顺序/类型比对。哪怕只是改了 [DataMember(Order = 0)] 里的数字,或给字段加了默认值,都可能触发 AvroRuntimeException: Field not found: xxx

星月写作
星月写作

专为网络小说、 剧本创作者打造的AI增效工具

下载
  • 确保读取用的 T 和写入用的是同一个编译版本的类(dll 不能混用)
  • 如果文件是用旧版 Schema 写的,而你现在用新类读,得用 DataFileReader<object></object> + 手动解析,或者启用 Schema resolution(需要额外传入 writer schema 和 reader schema)
  • 读大文件时注意内存:默认 DataFileReader 会把整个 block 解压进内存,若单条记录大、block 大,容易 OOM;可设 reader.Configuration.MaxBlockSize = 64 * 1024

别忽略 Apache.AvroConfluent.SchemaRegistry 的定位差异

前者是通用 AVRO 序列化库,适合离线文件读写;后者是 Kafka 生态专用,强依赖远程 Schema Registry 服务,本地读写 AVRO 文件时引入它反而多出 HTTP 依赖和配置负担。

  • 纯文件场景,只装 Apache.Avro(注意 NuGet 包名是 Apache.Avro,不是 avroAvro
  • Confluent.SchemaRegistryAvroSerializer<t></t> 默认不写 Schema 到文件,它只生成二进制消息体,Schema 存 Registry —— 直接拿它的输出去存成 .avro 文件,读的时候根本找不到 Schema
  • 如果项目已用 Confluent.Kafka,又想复用其序列化逻辑,得额外调用 schemaRegistryClient.GetLatestSchemaAsync(subject) 拿到 Schema,再喂给 DataFileWriter

实际用下来,Schema 定义和类型绑定那步最容易卡住——不是语法错,而是字段命名大小写、nullability、嵌套类的访问修饰符这些细节,都会让 Schema 推导失败。宁可多花两分钟手写 JSON Schema,也别赌自动推导能猜对你的心思。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

455

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

334

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

kafka消费者组有什么作用
kafka消费者组有什么作用

kafka消费者组的作用:1、负载均衡;2、容错性;3、广播模式;4、灵活性;5、自动故障转移和领导者选举;6、动态扩展性;7、顺序保证;8、数据压缩;9、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

175

2024.01.12

kafka消费组的作用是什么
kafka消费组的作用是什么

kafka消费组的作用:1、负载均衡;2、容错性;3、灵活性;4、高可用性;5、扩展性;6、顺序保证;7、数据压缩;8、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

159

2024.02.23

rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

207

2024.02.23

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

168

2026.02.04

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.1万人学习

C 教程
C 教程

共75课时 | 5.3万人学习

C++教程
C++教程

共115课时 | 21.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号