編集:Type
シリアル化
サポートはいるProtobufネットはあなたのをシリアル化するためのものであるR580
に含まれていますデータ、あなたの実装ではありません。 Type
は実装の詳細です。厳密に言えば、追加することは非常に難しいことではないでしょう(実装固有の詳細のいくつかはすでにアセンブリ修飾名によってType
情報を格納することになります)が、それは重要なシナリオではなく、多くの場合方法はではない何か私はあなたがシリアル化することをお勧めします - プロトコルバッファの全体のポイントは、バージョンの許容差をキーとする任意のプラットフォームでデータを読み込むことができることです。 Type
の情報を格納すると、これらの両方に違反します。
またがType
をシリアライズすることを拒否します(すでにプラットフォーム/バージョン-寛容のすべてのルールを破るおそらくBinaryFormatter
除く、)ほとんど他シリアライザことにもに留意すべきです。 XmlSerializer
、DataContractSerializer
、JavaScriptSerializer
などすべてはこのシナリオの例外を投げます(私はそれらをチェックしました)。さらに
:あなたはDynamicType
機能を使用しない限りobject
は、さえ少ないサポート可能です。
ここでは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; }
}
更新の答えを参照してください。これは後であなたのコメントのために –