Newtonsoft.Json 有用于匿名类型的长 $type 字符串
Newtonsoft.Json has long $type strings for anonymous types
当 Json.Net
typenamehandling
设置为 Object 时,匿名对象可以有很长的类型名,例如:
_IB_8bgoVaqDaVjOpT0PxYDBjiO_pwOo[[System.Guid, mscorlib],[System.Nullable`1[[System.Guid, mscorlib]], mscorlib],[System.String, mscorlib],[System.String, mscorlib],[System.String, mscorlib],[System.String, mscorlib],[System.String, mscorlib],[System.String, mscorlib],[System.Nullable`1[[System.Int32, mscorlib]], mscorlib],[System.Nullable`1[[System.Int32, mscorlib]], mscorlib],[System.Nullable`1[[System.Int32, mscorlib]], mscorlib],[System.String, mscorlib]], _IB_8bgoVaqDaVjOpT0PxYDBjiO_pwOo_IdeaBlade
是否有任何我可以调整的设置来减小该大小?
创建您自己的从 DefaultSerializationBinder 派生的 SerializationBinder。
使用您自己的匿名类型逻辑(默认实现如下)覆盖 BindToName(下面的默认代码):
public override void BindToName(Type serializedType, out string assemblyName, out string typeName)
{
#if NETFX_CORE || PORTABLE
assemblyName = serializedType.GetTypeInfo().Assembly.FullName;
typeName = serializedType.FullName;
#else
assemblyName = serializedType.Assembly.FullName;
typeName = serializedType.FullName;
#endif
}
然后,在调用 Serialize 或 Deserialize 之前,将 JsonSerializer 的 Binder 属性 设置为自定义 SerializationBinder 的实例。
您的实施可能类似于:
public override void BindToName(Type serializedType, out string assemblyName, out string typeName)
{
//
if(Attribute.IsDefined(type, typeof(CompilerGeneratedAttribute), false)
&& type.IsGenericType && type.Name.Contains("AnonymousType")
&& (type.Name.StartsWith("<>") || type.Name.StartsWith("VB$"))
&& (type.Attributes & TypeAttributes.NotPublic) == TypeAttributes.NotPublic)
{
return "AnonymousType";
}
base.BindToName(serializedType, out assemblyName, out typeName);
}
当 Json.Net
typenamehandling
设置为 Object 时,匿名对象可以有很长的类型名,例如:
_IB_8bgoVaqDaVjOpT0PxYDBjiO_pwOo[[System.Guid, mscorlib],[System.Nullable`1[[System.Guid, mscorlib]], mscorlib],[System.String, mscorlib],[System.String, mscorlib],[System.String, mscorlib],[System.String, mscorlib],[System.String, mscorlib],[System.String, mscorlib],[System.Nullable`1[[System.Int32, mscorlib]], mscorlib],[System.Nullable`1[[System.Int32, mscorlib]], mscorlib],[System.Nullable`1[[System.Int32, mscorlib]], mscorlib],[System.String, mscorlib]], _IB_8bgoVaqDaVjOpT0PxYDBjiO_pwOo_IdeaBlade
是否有任何我可以调整的设置来减小该大小?
创建您自己的从 DefaultSerializationBinder 派生的 SerializationBinder。
使用您自己的匿名类型逻辑(默认实现如下)覆盖 BindToName(下面的默认代码):
public override void BindToName(Type serializedType, out string assemblyName, out string typeName)
{
#if NETFX_CORE || PORTABLE
assemblyName = serializedType.GetTypeInfo().Assembly.FullName;
typeName = serializedType.FullName;
#else
assemblyName = serializedType.Assembly.FullName;
typeName = serializedType.FullName;
#endif
}
然后,在调用 Serialize 或 Deserialize 之前,将 JsonSerializer 的 Binder 属性 设置为自定义 SerializationBinder 的实例。
您的实施可能类似于:
public override void BindToName(Type serializedType, out string assemblyName, out string typeName)
{
//
if(Attribute.IsDefined(type, typeof(CompilerGeneratedAttribute), false)
&& type.IsGenericType && type.Name.Contains("AnonymousType")
&& (type.Name.StartsWith("<>") || type.Name.StartsWith("VB$"))
&& (type.Attributes & TypeAttributes.NotPublic) == TypeAttributes.NotPublic)
{
return "AnonymousType";
}
base.BindToName(serializedType, out assemblyName, out typeName);
}