StructBsonSerialize.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. using MongoDB.Bson;
  5. using MongoDB.Bson.IO;
  6. using MongoDB.Bson.Serialization;
  7. using MongoDB.Bson.Serialization.Serializers;
  8. namespace ET
  9. {
  10. public class StructBsonSerialize<TValue>: StructSerializerBase<TValue> where TValue : struct
  11. {
  12. public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TValue value)
  13. {
  14. Type nominalType = args.NominalType;
  15. IBsonWriter bsonWriter = context.Writer;
  16. bsonWriter.WriteStartDocument();
  17. FieldInfo[] fields = nominalType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
  18. foreach (FieldInfo field in fields)
  19. {
  20. bsonWriter.WriteName(field.Name);
  21. BsonSerializer.Serialize(bsonWriter, field.FieldType, field.GetValue(value));
  22. }
  23. bsonWriter.WriteEndDocument();
  24. }
  25. public override TValue Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
  26. {
  27. //boxing is required for SetValue to work
  28. object obj = new TValue();
  29. Type actualType = args.NominalType;
  30. IBsonReader bsonReader = context.Reader;
  31. bsonReader.ReadStartDocument();
  32. while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
  33. {
  34. string name = bsonReader.ReadName(Utf8NameDecoder.Instance);
  35. FieldInfo field = actualType.GetField(name,BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
  36. if (field != null)
  37. {
  38. object value = BsonSerializer.Deserialize(bsonReader, field.FieldType);
  39. field.SetValue(obj, value);
  40. }
  41. }
  42. bsonReader.ReadEndDocument();
  43. return (TValue) obj;
  44. }
  45. }
  46. }