2012-10-26 22 views
5

Służam do szeregowania niektórych danych, takich jak pola i klasa niestandardowa, w celu utworzenia danych binarnych (tablicy bajtów).Wyjątek deserializacji: Nie można znaleźć zestawu

Następnie chcę Deserialize wracać z danych binarnych do pól i klasy.

Ale mam wyjątek. Wszystko byłoby dobrze, gdyby te dwie metody miały miejsce w tym samym zespole - ale nie.

Wykonuję serializację w jednym assambly i przeprowadzam deserializację w innym. I to jest również pokrewieństwo: Unable to find assembly 'MyAssamblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

UWAGA 1: Nie mam problemów z odzyskaniem pól, tylko klasy je powodują.

UWAGA 2: Mam tę samą klasę w obu zespołach.

+0

K ... Kontekst; należy założyć, że używasz BinaryFormatter? Typ serializowany: czy w zespole, do którego odnoszą się oba projekty? Czy przypadkowo szeregujesz więcej danych niż oczekujesz w trakcie wydarzeń? (zdarza się to bardzo często) –

Odpowiedz

6

UWAGA 2: Mam tę samą klasę w obu zespołach

No nie. Przynajmniej nie dotyczy to środowiska wykonawczego. Masz dwa różne typy, które mają tę samą nazwę. Typ jest zdefiniowany przez jego montaż. Zatem "SomeType w AssemblyA" jest zupełnie inne niż "SomeType w AssemblyB", nawet jeśli zostały one skompilowane z tego samego pliku źródłowego.

BinaryFormatter działa z informacją o typie, więc to nie zadziała. Jedną z opcji byłoby przeniesienie tego typu do biblioteki DLL, do której odwołują się oba pozostałe projekty - wtedy jest ona zdefiniowana tylko raz i będzie szczęśliwa.

Inną opcją jest praca z serializerem opartym na umowie (zamiast serializera opartego na typie). Oznacza to, że "klasy, które wyglądają na tyle podobne" są w porządku, nawet jeśli są w różnych złożeniach (i być może mają inne źródło, o ile jest "wystarczająco podobny"). Przykłady odpowiednich serializerów do tego obejmowałyby (plus kilka innych) XmlSerializer, DataContractSerializer (ale nie NetDataContractSerializer), JavaScriptSerializer lub protobuf-net, jeśli chcesz gęstego surowego pliku binarnego.

+0

Tak, używam BinaryFormatter. Chciałbym pójść z twoją pierwszą opcją. Muszę więc stworzyć nowy projekt i dodać go do obu pozostałych projektów? Czy mam rację? –

+1

W rozwiązaniu dodaj nowy projekt - wybierz "biblioteka". Teraz umieść tam klasę i zdejmij ją z pozostałych dwóch miejsc. Na koniec, dla obu oryginalnych projektów: referencje, dodaj odniesienie ... wybierz nowo utworzony projekt biblioteki. –

+0

Właśnie to zrobiłem! Thxa lot mate. Dowiesz Ci, czy to zadziała (ale wiem, że to zrobi :)). –

2

Wszystkie zestawy zawierające klasy w hierarchii klas obiektu podlegającego deserializacji muszą być obecne w aplikacji, w której przeprowadzasz tę deserializację. Można je jawnie odwoływać się (jeśli potrzebujemy bezpieczeństwa podczas kompilacji z tymi klasami) lub umieścić tylko w folderze aplikacji bin, aby można było je rozwiązać w środowisku wykonawczym. Jeśli nie są one jawnie przywoływane, będziesz musiał użyć odbicia, aby odczytać wartości z postaci zserializowanej.

Powiązane problemy