2012-09-18 16 views
9

otrzymuję następujący komunikat o błędzie podczas próby serializacji List<Tuple<string, Type, object>>: Nie serializer zdefiniowane dla typu: System.TypeProtobuf-Net Błąd: Nie serializer zdefiniowane dla typu: System.Type

Próbowałem obu, tylko szeregowania powyższy zbiór lub serializacja klasy, która ma ten sam zbiór zdefiniowany jako protoMember. Oba skutkują tym samym komunikatem o błędzie.

Czy to jest typ nieobsługiwany? Zakładam, że jest obsługiwany i przeoczyłem coś innego, ale może jestem niepoprawny?

Dzięki za wszelkie wskazówki, które mogą pomóc rozwiązać ten ...

+0

Zobacz zaktualizowaną odpowiedź; jest to uwzględnione w późniejszych kompilacjach –

Odpowiedz

12

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; } 
} 
+0

dzięki za twoje komentarze. Ale co byś zrobił z serializacją takiej kolekcji? Muszę wysłać go przez magistralę komunikatów, która zezwala na transport tylko tablic bajtowych. Czy zmienia typ na ciąg znaków, a następnie przekształca go z powrotem w opcję typu? Zgadzam się z twoimi typami obiektów, myślę, że już wcześniej cię o to pytałem i wskazałeś mi funkcję DynamicType. –

+0

@Freddy rzeczywiście, najprostszą rzeczą byłoby przechowywanie 'string, string, object', używając' .AssemblyQualifiedName' oraz 'Type.GetType (string)'. Jeśli chcesz uzyskać * naprawdę * egzotyczne, możesz prawdopodobnie dodać * zastępcze * dla 'Type' (protobuf-net obsługuje to). Na poziomie technicznym mogę * wspierać * go bez zbytniego bólu, ale wydaje mi się, że ułatwiłbym ludziom strzelanie sobie w stopę ... z bazooką. –

+0

dzięki za wskazówki, naprawdę doceniam. Rozsądnie jest zachować bibliotekę, ponieważ jest to pożądana platforma i niezależność od wersji.Już założyłem to, co opisałeś w swojej odpowiedzi, ponieważ przechowujesz typy poprzez kwalifikowane nazwy zespołów, w przeciwnym razie prawdopodobnie nie rozumiem, w jaki sposób deserializator później obsługuje swoje zadania bez pomocy informacji o typie. Ale mogę być całkowicie wyłączony, ponieważ w ogóle nie patrzę na twój kod źródłowy. –

Powiązane problemy