Json.Net
typenamehandling
がオブジェクトに設定されている場合、匿名オブジェクトは次のように非常に長いタイプ名を持つことができます。
_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)
{
//http://stackoverflow.com/questions/2483023/how-to-test-if-a-type-is-anonymous
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);
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加