gpt4 book ai didi

c# - Microsoft Avro 序列化程序正在处理提供的模式

转载 作者:行者123 更新时间:2023-12-05 05:36:02 31 4
gpt4 key购买 nike

我正在尝试写出 Avro 文件,但在序列化方面遇到了一些真正的麻烦。我正在使用 Microsoft.Avro.Core , 最近发现当我给它一个包含 type 和关联的 logicalType 的模式时,它会莫名其妙地提取内部 type 并使用它更换它!这意味着我的 DateTime 声明 "type": {"type": "long", "logicalType": "timestamp-micros"} 现在是一个简单的 "type": "long",收件人无法正确解释。

如果它只是在内部执行此操作以了解它正在使用的数据类型,那将是一回事。但是这个损坏的模式实际上被写入了输出文件,这是完全不正确的行为。有谁知道解决或解决这个问题的方法吗?

(是的,这个库已经 5 年没有更新了,可能完全不受支持。但它是我能找到的唯一满足一个关键要求的 .NET Avro 序列化程序:允许我使用未知的任意类型在编译时。其他一切似乎都只想使用 T 类型的通用序列化器,但我的用例不能提供 T。所以我不能放弃这个库是为了更好的东西,除非真的有更好的东西我可以使用。但如果有,我会接受它。)

最佳答案

在大量搜索和查看文档不完整的源代码之后,我找到了解决方案。尽管official Avro library如果您将类型指定为 GenericRecord,则来自 Apache 的所有读取器和写入器确实需要一个通用类型参数。 ,它将让您将 GenericRecord 作为运行时定义的结构来使用。 (这不是任意的动态类型,因为您分配给它的字段的值仍然必须与提供的模式匹配。)

与此同时,这个库的类型系统对 Avro 类型集的支持比被遗弃的 Microsoft 类型系统要广泛得多。它可以正确地处理 Avro 的逻辑类型,并按照您期望的方式在它们和 CLR 类型之间进行转换,但有一个值得注意的异常(exception):序列化 DateTime 会将其从系统的本地时间转换为 UTC。 (可能有解决此问题的方法,但我还没有找到。)

就把它留在这里,以防将来有人遇到类似的问题。

关于c# - Microsoft Avro 序列化程序正在处理提供的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73375067/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com