【问题标题】:Can a C# model be serialized as an AVRO JSON Schema?可以将 C# 模型序列化为 AVRO JSON 模式吗?
【发布时间】:2017-07-26 23:06:53
【问题描述】:

我在这里找到了一些代码https://docs.microsoft.com/en-us/azure/hdinsight/hdinsight-dotnet-avro-serialization#Scenario2,它可以反转我所需要的:

//Define the schema in JSON
const string Schema = @"{
    ""type"":""record"",
    ""name"":""Microsoft.Hadoop.Avro.Specifications.SensorData"",
    ""fields"":
        [
            {
                ""name"":""Location"",
                ""type"":
                    {
                        ""type"":""record"",
                        ""name"":""Microsoft.Hadoop.Avro.Specifications.Location"",
                        ""fields"":
                            [
                                { ""name"":""Floor"", ""type"":""int"" },
                                { ""name"":""Room"", ""type"":""int"" }
                            ]
                    }
            },
            { ""name"":""Value"", ""type"":""bytes"" }
        ]
}";

//Create a generic serializer based on the schema
var serializer = AvroSerializer.CreateGeneric(Schema);

我想采用我创建的模型:

[DataContract(Name = "Demo", Namespace = "pubsub.demo")]
public class Demo
{
    [DataMember(Name = "value")]
    public long Value { get; set; }
}

...并将此 C# 模型序列化为 JSON AVRO Schema 字符串。

原因:

我只想维护 C# 模型并自动将这些模型注册到 Confluent 的 Schema Registry。要向架构注册表注册,架构需要采用 JSON AVRO 格式(就像上面的 Schema)。

我不希望同时定义 JSON 和 C# 模型。如果我必须维护一个,我更愿意拥有一个 C# 模型。

【问题讨论】:

  • 后期评论:Confluent-dotnet-kafka 库现在包含 avrogen,这是一个将架构转换为 C# 对象的工具
  • @cricket_007 如果您将消息发布为ISpecificRecordGenericRecord,对消费者有什么不同吗?或者那些仍然是消息中的相同字节数组?
  • @Olegi 字节将是相同的
  • @cricket_007 感谢您的回复!如果您的主题包含不同的事件模型,生成消息的首选方式是什么?我应该生成特定记录还是通用记录?此外,作为消费者,我认为只有一种方式可以从该主题中消费 - 是 GenericRecord?因为基本上你不能在构建消费者时传递你期望的类型数组。在网络上真的没有这些场景的示例:(
  • @OlegI 你可以看这个关于C#支持多种类型的问题github.com/confluentinc/confluent-kafka-dotnet/issues/746

标签: c# avro confluent-schema-registry


【解决方案1】:

我在 Microsoft.Hadoop.Avro.AvroSerializer 中找到了我想要的东西。

AvroSerializer.Create<Demo>().WriterSchema.ToString();
// > {"type":"record","name":"pubsub.demo.Demo","fields"[{"name":"value","type":"long"}]}

【讨论】:

【解决方案2】:

解决方案也可以是:

string schema = AvroConvert.GenerateSchema(typeof(Demo));

来自https://github.com/AdrianStrugala/AvroConvert

【讨论】:

    【解决方案3】:

    Chr.Avro 提供了一个 CLI,让您可以双向使用 - C# 类型到 Avro 架构,以及 Avro 架构到 C# 类型。

    来自文档:

    dotnet avro create --type ExampleNamespace.ExampleLibrary.ExampleClass --assembly bin/Debug/netstandard2.0/ExampleNamespace.ExampleLibrary.dll

    https://engineering.chrobinson.com/dotnet-avro/guides/cli-create

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多