/
CompositeSerializationBinder.cs
45 lines (39 loc) · 1.73 KB
/
CompositeSerializationBinder.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Runtime.Serialization;
using Composite.Core.Types;
using Newtonsoft.Json.Serialization;
namespace Composite.Core.Serialization
{
/// <summary>
/// Removes temproraty assembly references when serializing references to generated classes.
/// </summary>
internal class CompositeSerializationBinder: DefaultSerializationBinder
{
private const string GeneratedTypesNamespacePrefix = "CompositeGenerated.";
private const string GeneratedTypesAssemblyName = "Composite.Generated";
public static SerializationBinder Instance { get; } = new CompositeSerializationBinder();
public override void BindToName(Type serializedType, out string assemblyName, out string typeName)
{
typeName = serializedType.FullName;
if (typeName.StartsWith(GeneratedTypesNamespacePrefix, StringComparison.OrdinalIgnoreCase)
&& Guid.TryParse(serializedType.Assembly.GetName().Name, out _))
{
assemblyName = GeneratedTypesAssemblyName;
}
else
{
assemblyName = serializedType.Assembly.FullName;
}
}
public override Type BindToType(string assemblyName, string typeName)
{
if (assemblyName == GeneratedTypesAssemblyName
&& typeName.StartsWith(GeneratedTypesNamespacePrefix, StringComparison.OrdinalIgnoreCase))
{
var result = TypeManager.TryGetType($"{typeName}, {assemblyName}") ?? TypeManager.TryGetType(typeName);
if (result != null) return result;
}
return base.BindToType(assemblyName, typeName);
}
}
}