Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 311a631

Browse files
sancheolzyallie
authored andcommitted
fix for #194 Ignore assembly version for deserialized types
1 parent 754f214 commit 311a631

File tree

2 files changed

+63
-4
lines changed

2 files changed

+63
-4
lines changed

CoreRemoting/Serialization/Bson/Envelope.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public class Envelope
1717
private object _value;
1818

1919
[JsonProperty]
20+
[JsonConverter(typeof(TypeIgnoreVersionConverter))]
2021
private Type _type;
2122

2223
/// <summary>
@@ -66,10 +67,10 @@ public object Value
6667

6768
// Special handling for enum values, because BSON serializes every integer as Int64!
6869
if (_type.IsEnum)
69-
return Enum.ToObject(_type, _value);
70-
71-
// Special handling for serialized DiffGrams
72-
if (_value is SerializedDiffGram serializedDiffGram)
70+
return Enum.ToObject(_type, _value);
71+
72+
// Special handling for serialized DiffGrams
73+
if (_value is SerializedDiffGram serializedDiffGram)
7374
return serializedDiffGram.Restore(_type);
7475

7576
// Special handling for encodings (Many encodings have its own class e.g. UTF8Encoding)
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using System;
2+
using System.Linq;
3+
using System.Reflection;
4+
using Newtonsoft.Json;
5+
6+
namespace CoreRemoting.Serialization.Bson;
7+
8+
internal class TypeIgnoreVersionConverter : JsonConverter
9+
{
10+
public override bool CanConvert(Type objectType)
11+
{
12+
return objectType == typeof(Type);
13+
}
14+
15+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
16+
JsonSerializer serializer)
17+
{
18+
if (reader.TokenType == JsonToken.Null)
19+
{
20+
return null;
21+
}
22+
23+
string typeFullName = reader.Value as string;
24+
25+
Type resultType = GetTypeWithoutVersion(typeFullName);
26+
27+
return resultType;
28+
}
29+
30+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
31+
{
32+
writer.WriteValue(((Type)value)?.AssemblyQualifiedName);
33+
}
34+
35+
private Type GetTypeWithoutVersion(string fullTypeName)
36+
{
37+
var resultType = Type.GetType(fullTypeName);
38+
39+
if (resultType != null || string.IsNullOrEmpty(fullTypeName))
40+
return resultType;
41+
42+
var commaIndex = fullTypeName.IndexOf(',');
43+
if (commaIndex <= 0)
44+
return null;
45+
string simpleTypeName = fullTypeName.Substring(0, commaIndex).Trim();
46+
string assemblyName = new AssemblyName(fullTypeName.Substring(commaIndex + 1).Trim()).Name;
47+
resultType = FindTypeInLoadedAssemblies(simpleTypeName, assemblyName);
48+
49+
return resultType;
50+
}
51+
52+
private static Type FindTypeInLoadedAssemblies(string typeName, string assemblyName)
53+
{
54+
return (from assembly in AppDomain.CurrentDomain.GetAssemblies()
55+
where assembly.FullName != null && assembly.FullName.Contains(assemblyName)
56+
select assembly.GetType(typeName)).FirstOrDefault(foundType => foundType != null);
57+
}
58+
}

0 commit comments

Comments
 (0)