c# - 使用 mongoDB c# 驱动程序将对象序列化为字符串值(就像在其上调用 ToString() 一样)

标签 c# mongodb serialization bson

我正在使用 MongoDB C# 驱动程序。 我在 C# 中有一个数据结构

public class ResourceSpec
{
      public string TypeName
      {
          get;
          private set;
      }

      public HashSet<ResourceProperty> Properties
      {
          get;
          private set;
      }
}

public class ResourceProperty
{
     public string Val
     {
         get;
         private set;
     }
} 

我希望它被序列化为:

{TypeName: 'blabla', Properties: ['value1', 'value2', 'value3' ]}

代替

{TypeName: 'blabla', Properties: [{Val: 'value1'}, {Val: ' value2'}, {Val: ' value3'}] }

我该怎么做?

最佳答案

您可以编写自定义序列化程序并将其注册到驱动程序。需要注意的一件事是,一旦您注册了序列化程序,它将用于每个 ResourceSpec 实例。

public class ResourceSpecSerializer : BsonBaseSerializer
{
    public override object Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options)
    {
        // Deserialize logic
    }

    public override void Serialize(BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options)
    {
        // Serialize logic
    }

并使用 BsonSerializer.RegisterSerializer 注册它

BsonSerializer.RegisterSerializer(typeof(ResourceSpec), new ResourceSpecSerializer());

为了实现自定义 JSON,我建议查看 Json.NET特别是 JsonWriter

下面是一个使用 JsonWriter 的例子:

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb); 

using(JsonWriter writer = new JsonTextWriter(sw))
{
    writer.Formatting = Formatting.Indented;

    writer.WriteStartObject();
    writer.WritePropertyName("CPU");
    writer.WriteValue("Intel");
    writer.WritePropertyName("PSU");
    writer.WriteValue("500W");
    writer.WritePropertyName("Drives");
    writer.WriteStartArray();
    writer.WriteValue("DVD read/writer");
    writer.WriteComment("(broken)");
    writer.WriteValue("500 gigabyte hard drive");
    writer.WriteValue("200 gigabype hard drive");
    writer.WriteEnd();
    writer.WriteEndObject();
}

将显示:

 {
    "CPU": "Intel",
    "PSU": "500W",
    "Drives": [
         "DVD read/writer"
         /*(broken)*/,
        "500 gigabyte hard drive",
        "200 gigabype hard drive"
     ]
 }

关于c# - 使用 mongoDB c# 驱动程序将对象序列化为字符串值(就像在其上调用 ToString() 一样),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24090918/

相关文章:

c# - 用C#读取Excel文件——选择工作表

c# - volatile IEnlistmentNotification 和 TransactionScope.AsyncFlowEnabled = true

ruby-on-rails - 尝试使用 mongoid 作为 orm in rails 连接到 ec2 上的 mongodb 实例

java - 为不同端点切换 JSON 序列化器

java - 使Jackson在序列化时不输出类名(使用Spring MVC)

c# - 使用 Automapper 进行深度映射

node.js - 使用 MongoDB 和 Angular universal/webpack 的关键依赖

java - TokenStore MongoDB Spring OAuth2

c++ - C/C++ 中 union 数组的序列化/反序列化

c# - 如何使用 Wix 安装 .NET Framework 的可再发行组件包?