Edit:
Wsparcie Type
serializacji jest wliczone w R580
protobuf netto ma szeregować swoje dane, a nie twoje wdrożenie; Type
to szczegół implementacji. Ściśle mówiąc, nie byłoby bardzo trudno dodać (niektóre szczegóły dotyczące konkretnej implementacji już w zasadzie przechodzą do przechowywania informacji Type
za pośrednictwem nazwy kwalifikowanej do zestawu), ale: nie jest to kluczowy scenariusz, aw wielu przypadkach to jest coś, co zachęciłbym do serializacji - cały punkt buforów protokołu polega na tym, że można załadować dane na dowolnej platformie, a tolerancja wersji jest kluczową cechą. Przechowywanie informacji Type
narusza oba te.
Należy również zauważyć, że większość inne serializers (może z wyjątkiem BinaryFormatter
, który już łamie wszelkie reguły platformy/wersja tolerancji) będzie również odmówić serializować Type
; XmlSerializer
, DataContractSerializer
, JavaScriptSerializer
itd. all wyrzuć wyjątek dla tego scenariusza (właśnie je sprawdziłem).
Dodatkowo: object
jest jeszcze mniej obsługiwany, chyba że używasz funkcji DynamicType
.
Oto jak można to zrobić za pomocą zastępczego na 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; }
}
Zobacz zaktualizowaną odpowiedź; jest to uwzględnione w późniejszych kompilacjach –