Skip to content

Commit a34b103

Browse files
authored
Merge pull request #219 from cnblogs/revert-217-use-mongodb-bson
Revert "refactor: use MongoDB.Bson instead of Newtonsoft.Json.Bson"
2 parents 62f6564 + 714e259 commit a34b103

File tree

4 files changed

+76
-15
lines changed

4 files changed

+76
-15
lines changed

src/Enyim.Caching/Enyim.Caching.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020

2121
<ItemGroup>
2222
<FrameworkReference Include="Microsoft.AspNetCore.App" />
23+
<PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.2" />
2324
</ItemGroup>
2425

2526
<ItemGroup>
2627
<PackageReference Include="MessagePack" Version="2.5.140" />
27-
<PackageReference Include="MongoDB.Bson" Version="2.24.0" />
2828
</ItemGroup>
2929

3030
<ItemGroup>

src/Enyim.Caching/Memcached/Transcoders/DataContractTranscoder.cs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,43 @@
1+
using System;
2+
using System.IO;
3+
using System.Runtime.Serialization;
4+
using System.Text;
5+
using Newtonsoft.Json;
6+
using Newtonsoft.Json.Bson;
7+
18
namespace Enyim.Caching.Memcached
29
{
310
/// <summary>
411
/// Default <see cref="T:Enyim.Caching.Memcached.ITranscoder"/> implementation. Primitive types are manually serialized, the rest is serialized using <see cref="T:System.Runtime.Serialization.NetDataContractSerializer"/>.
512
/// </summary>
613
public class DataContractTranscoder : DefaultTranscoder
7-
{ }
14+
{
15+
protected override object DeserializeObject(ArraySegment<byte> value)
16+
{
17+
using (var ms = new MemoryStream(value.Array, value.Offset, value.Count))
18+
{
19+
using (var reader = new BsonDataReader(ms))
20+
{
21+
JsonSerializer serializer = new JsonSerializer();
22+
return serializer.Deserialize(reader);
23+
}
24+
}
25+
}
26+
27+
protected override ArraySegment<byte> SerializeObject(object value)
28+
{
29+
using (var ms = new MemoryStream())
30+
{
31+
using (var writer = new BsonDataWriter(ms))
32+
{
33+
JsonSerializer serializer = new JsonSerializer();
34+
serializer.Serialize(writer, value);
35+
}
36+
37+
return new ArraySegment<byte>(ms.ToArray(), 0, (int)ms.Length);
38+
}
39+
}
40+
}
841
}
942

1043
#region [ License information ]

src/Enyim.Caching/Memcached/Transcoders/DefaultTranscoder.cs

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
using MongoDB.Bson;
2-
using MongoDB.Bson.Serialization;
3-
using MongoDB.Bson.Serialization.Serializers;
1+
using Newtonsoft.Json;
2+
using Newtonsoft.Json.Bson;
43
using System;
4+
using System.Collections;
5+
using System.IO;
6+
using System.Linq;
7+
using System.Reflection;
58
using System.Text;
69

710
namespace Enyim.Caching.Memcached
@@ -14,12 +17,6 @@ public class DefaultTranscoder : ITranscoder
1417
public const uint RawDataFlag = 0xfa52;
1518
private static readonly ArraySegment<byte> NullArray = new([]);
1619

17-
static DefaultTranscoder()
18-
{
19-
var objectSerializer = new ObjectSerializer(ObjectSerializer.AllAllowedTypes);
20-
BsonSerializer.RegisterSerializer(objectSerializer);
21-
}
22-
2320
CacheItem ITranscoder.Serialize(object value)
2421
{
2522
return Serialize(value);
@@ -52,7 +49,14 @@ public virtual T Deserialize<T>(CacheItem item)
5249
}
5350
}
5451

55-
return BsonSerializer.Deserialize<T>(item.Data.ToArray());
52+
using var ms = new MemoryStream(item.Data.ToArray());
53+
using var reader = new BsonDataReader(ms);
54+
if (typeof(T).GetTypeInfo().ImplementedInterfaces.Contains(typeof(IEnumerable)))
55+
{
56+
reader.ReadRootValueAsArray = true;
57+
}
58+
var serializer = new JsonSerializer();
59+
return serializer.Deserialize<T>(reader);
5660
}
5761

5862
protected virtual CacheItem Serialize(object value)
@@ -257,8 +261,15 @@ protected virtual ArraySegment<byte> SerializeSingle(Single value)
257261

258262
protected virtual ArraySegment<byte> SerializeObject(object value)
259263
{
260-
var bson = value.ToBson();
261-
return new ArraySegment<byte>(bson, 0, bson.Length);
264+
using (var ms = new MemoryStream())
265+
{
266+
using (var writer = new BsonDataWriter(ms))
267+
{
268+
var serializer = new JsonSerializer();
269+
serializer.Serialize(writer, value);
270+
return new ArraySegment<byte>(ms.ToArray(), 0, (int)ms.Length);
271+
}
272+
}
262273
}
263274

264275
#endregion
@@ -336,7 +347,14 @@ protected virtual sbyte DeserializeSByte(ArraySegment<byte> data)
336347

337348
protected virtual object DeserializeObject(ArraySegment<byte> value)
338349
{
339-
return BsonSerializer.Deserialize<object>(value.Array);
350+
using (var ms = new MemoryStream(value.Array, value.Offset, value.Count))
351+
{
352+
using (var reader = new BsonDataReader(ms))
353+
{
354+
JsonSerializer serializer = new JsonSerializer();
355+
return serializer.Deserialize(reader);
356+
}
357+
}
340358
}
341359

342360
#endregion

src/Enyim.Caching/Memcached/Transcoders/MessagePackTranscoder.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
using MessagePack;
22
using MessagePack.Resolvers;
3+
using Microsoft.Extensions.Options;
4+
using Newtonsoft.Json.Bson;
5+
using Newtonsoft.Json.Linq;
36
using System;
7+
using System.Collections;
8+
using System.Collections.Generic;
9+
using System.Collections.Immutable;
10+
using System.IO;
11+
using System.Reflection;
12+
using System.Runtime.CompilerServices;
13+
using System.Text;
414

515
namespace Enyim.Caching.Memcached.Transcoders
616
{

0 commit comments

Comments
 (0)