Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中反序列化AVRO_C#_Apache Kafka_Avro - Fatal编程技术网

C# 在c中反序列化AVRO

C# 在c中反序列化AVRO,c#,apache-kafka,avro,C#,Apache Kafka,Avro,我有一个用JSON格式编写的模式。我从kafka服务器上得到一个字符串,看起来像: \0\0\0\u00032H45d71580-9781-4d9c-8535-a233ff7c3122\nPLANTH45d71580-9781-4d9c-8535-a233ff7c3122\nPLANT,2017-12-12T16:34:15GMT\u001020171212\u0018201712121034\nTH1AB5297A-9D28-4742-A95C-4A4CEED7037D\nfalse\nPas

我有一个用JSON格式编写的模式。我从kafka服务器上得到一个字符串,看起来像:

\0\0\0\u00032H45d71580-9781-4d9c-8535-a233ff7c3122\nPLANTH45d71580-9781-4d9c-8535-a233ff7c3122\nPLANT,2017-12-12T16:34:15GMT\u001020171212\u0018201712121034\nTH1AB5297A-9D28-4742-A95C-4A4CEED7037D\nfalse\nPass\ncross\u00021\u00025

现在,我尝试反序列化字符串,并根据模式文件将其设置为对象。我怎样才能在c语言中做到这一点?有我可以使用的图书馆吗

我试过Microsoft.Hadoop.Avro。 一旦代码运行到:

var actual = avroSerializer.Deserialize(buffer);
它将抛出一个异常: 数组维度超出了支持的范围

我从卡夫卡那里得到绳子。另一个应用程序生成它,而我的应用程序使用它。应用程序使用swift编写,并使用一些nodejs库进行序列化。我猜字符串的格式是否重要


卡夫卡消息由Javascript应用程序生成。他们使用名为AVSC Avro for Javascript的库序列化字符串。一旦我得到一个字符串消息,我就把它转换成一个字节流,之后我发现这个字节与AVSC lib生成的原始字节有点不同。但是为什么呢?

你应该试试Microsoft.Hadoop.Avro.Container.AvroContainer这有一个方法CreateGenericReader。有点像

using (var reader = AvroContainer.CreateGenericReader(buffer))
        {
            while (reader.MoveNext())
            {
                foreach (dynamic record in reader.Current.Objects) {
                      // Take a look at what you get in the record
                }
            }
        }

Nuget软件包是.Net Core中的Microsoft.Avro.Tools v0.1.0

您应该尝试Microsoft.Hadoop.Avro.Container.AvroContainer这有一个方法CreateGenericReader。有点像

using (var reader = AvroContainer.CreateGenericReader(buffer))
        {
            while (reader.MoveNext())
            {
                foreach (dynamic record in reader.Current.Objects) {
                      // Take a look at what you get in the record
                }
            }
        }

Nuget包是.Net Core中的Microsoft.Avro.Tools v0.1.0,我怀疑这就是Swift应用程序用来写入Kafka的Java库,当它们序列化为Avro的二进制编码时,会写入一个神奇的字节。见本文:

他们使用它进行版本控制和向后兼容性,详细内容如下:


但是,您正在使用的Microsoft.Hadoop.Avro库在反序列化时不使用魔法字节。在调用反序列化之前,请尝试从流中删除第一个字节。

Confluent的Java库,我怀疑这就是Swift应用程序用来写入Kafka的Java库。当它们序列化为Avro的二进制编码时,Kafka会写入一个神奇的字节。见本文:

他们使用它进行版本控制和向后兼容性,详细内容如下:

但是,您正在使用的Microsoft.Hadoop.Avro库在反序列化时不使用魔法字节。在调用反序列化之前,请尝试从流中删除第一个字节。

您可以尝试使用 如果来自Kafka的文件仅包含数据,请使用:

var actual = AvroCnvert.DeserializeHeadless<TheModel>(buffer, schema);
您需要确保您的模型和模式是正确的

Avro是一种与JSON完全相同的数据格式。每个序列化程序实现或语言都应该相互兼容

您可以尝试使用 如果来自Kafka的文件仅包含数据,请使用:

var actual = AvroCnvert.DeserializeHeadless<TheModel>(buffer, schema);
您需要确保您的模型和模式是正确的


Avro是一种与JSON完全相同的数据格式。每个序列化程序实现或语言都应该相互兼容

与谷歌一起发现:还有。然而,不管是好是坏,询问工具或库建议的问题都在StackOverflow上。同时检查。我在发布问题之前检查了所有这些。这两种方法都不管用。微软hadoop avro并没有真正起作用…谷歌也有。然而,不管是好是坏,询问工具或库建议的问题都在StackOverflow上。同时检查。我在发布问题之前检查了所有这些。这两种方法都不管用。Microsoft hadoop avro实际上不起作用…我只是尝试了一下。它不起作用。它将在流中的有效avro对象容器中引发异常。我现在猜我从卡夫卡那里得到的字符串格式不正确…我只是试了一下。它不起作用。它将在流中的有效avro对象容器中引发异常。我现在猜测我从kafka得到的字符串的格式不正确……此外,如果您使用schema registry,它还会在magic byte之后追加4个字节,即schema ID的int32。我试图删除第一个字节,也删除前5个字节,但仍然会出现相同的错误。我检查了字节数组,似乎swift发布的字节是十六进制的,但我们从卡夫卡获得的字节是十进制的。十六进制和十进制是字节数组的编码;无论如何表示,底层字节都是相同的。Kafka仅仅是一个存储数据存储,因此如果您的Swift应用程序正在写入十六进制编码字符串,您必须从中获取一个字节数组,请尝试以下操作:添加到这个数组中,如果您使用的是schema registry,它还会在magic byte之后追加4个字节,即schema ID的int32。我尝试删除第一个字节,以及前5个字节,但它仍然给我同样的错误。我检查了字节数组,似乎swift发布的字节是十六进制的,但我们从卡夫卡获得的字节是十进制的。十六进制和十进制是字节数组的编码;无论基础字节的大小如何,它们都是相同的 代表了y。Kafka只是一个存储数据存储,因此如果您的Swift应用程序正在编写十六进制编码字符串,您必须从中获取字节数组,请尝试以下操作: