編集:
シリアル化のサポートType
はr580に含まれています
protobuf-netは、実装ではなく、データをシリアル化することを目的としています。Type
実装の詳細です。厳密に言えば、追加するのはそれほど難しいことではありません(実装固有の詳細の一部はType
、アセンブリ修飾名を介して、すでに基本的に情報を格納することになります)が、重要なシナリオではなく、多くの点でシリアル化することをお勧めするものではありません。プロトコルバッファの要点は、バージョントレランスが重要な機能であり、任意のプラットフォームにデータをロードできることです。情報の保存Type
は、これらの両方に違反します。
また、他のBinaryFormatter
ほとんどのシリアライザー(おそらく、プラットフォーム/バージョン許容度のすべてのルールをすでに破っているを除く)もType
、 ;のシリアル化を拒否することに注意してください。XmlSerializer
、、などはすべてDataContractSerializer
、このシナリオの例外をスローします(私はそれらをチェックしました)。JavaScriptSerializer
さらに、この機能を使用しない限り、サポートobject
はさらに少なくなりDynamicType
ます。
上の代理を介してそれを行う方法は次のType
とおりです。
using ProtoBuf;
using ProtoBuf.Meta;
using System;
using System.Runtime.Serialization;
static class Program
{
public static void Main(string[] args)
{
// register a surrogate for Type
RuntimeTypeModel.Default.Add(typeof(Type), false)
.SetSurrogate(typeof(TypeSurrogate));
// test it
var clone = Serializer.DeepClone(new Foo { Type = typeof(string) });
}
}
[ProtoContract]
class TypeSurrogate
{
[ProtoMember(1)]
public string AssemblyQualifiedName { get; set; }
// protobuf-net wants an implicit or explicit operator between the types
public static implicit operator Type(TypeSurrogate value)
{
return value==null ? null : Type.GetType(value.AssemblyQualifiedName);
}
public static implicit operator TypeSurrogate(Type value)
{
return value == null ? null : new TypeSurrogate {
AssemblyQualifiedName = value.AssemblyQualifiedName };
}
}
[DataContract]
public class Foo
{
[DataMember(Order=1)]
public Type Type { get; set; }
}