2011-07-12 12 views
9

W naszej aplikacji klient/serwer używamy BinaryFormatter do procesu serializacji. Ze względów wydajnościowych próbujemy przeprowadzić migrację do protobuf-net (http://code.google.com/p/protobuf-net/).Jak porównać dwa wykresy obiektów .NET dla różnic?

Nasze oprogramowanie przesyła ogromne wykresy z cyklami między klientem a serwerem.

Teraz szukam sposobu, aby upewnić się, że dane, które zostały serializowane i deserialized za pomocą protobuf jest dokładnie taki sam jak ten, który był zwykle przetwarzany przez BinaryFormatter.

Porównanie bit po bicie jest proste: Służę do serializacji przy użyciu BinaryFormatter do pliku. Ponownie rozpakuj ten plik, używając formatu BinaryFormatter. Następnie szereguję za pomocą ProtoBuf do pliku. Deserializuj za pomocą ProtoBuf z tego pliku. Ponownie szereguj Serialize za pomocą BinaryFormatter do pliku.

Następnie mogę po prostu porównać ten plik z oryginalnym plikiem.

Jednak te dwa pliki nie są w 100% równe. Teraz muszę znaleźć sposób, aby śledzić różnice w dół.

Czy jest jakieś narzędzie, które wizualizuje dane, które zostały serializowane przez BinaryFormatter? A może znasz innego pomocnika, który dokonuje głębokiego porównania i mówi mi, gdzie są różnice?

Używanie XMLSerializera i porównywanie dwóch plików XML nie jest możliwe, ponieważ BinaryFormatter jest w stanie szeregować więcej danych niż XMLSerializer - nawet bez wyraźnego zaznaczania pól.

Dziękuję TH

+0

Mam dużo kodu tutaj na SO dla porównywania poszczególnych obiektów, ale porównywanie całego wykresu jest ... trudne. Gdybym musiał * zgadnąć *, zastanawiałbym się, czy istnieją niewielkie różnice precyzji datetime. –

+0

Hej Marc. Gdyby pliki były niemal identyczne, zgadywałbym to samo. Jednak brakuje mi około 25% danych. Teraz zastanawiam się, czy na przykład odwołania do instancji zostały udostępnione, chociaż nie powinny (ponieważ oryginalne odwołania nie wskazywały na ten sam obiekt) lub po prostu zapomniałem dodać pewnych pól do TypeModel. Niektóre narzędzia byłyby świetne, które po prostu kreślą cały wykres obiektów na czytelnym dla człowieka wykresie (podobnym do tego, co robi http://ignatu.co.uk/ViewStateDecoder.aspx (jednak ten algorytm nie działa z naszymi ogromnymi wykresami)) – TwinHabit

Odpowiedz

5

Jak na temat korzystania z obiektów DataContractSerializer śledzenia włączony (preserveObjectReferences w konstruktorze). Ten powinien pozwolić ci serializować je do xml (przynajmniej sortowania), gdzie możesz być w stanie porównać różnice.

+0

Świetny pomysł. Dam ci szansę. Przy okazji odkryłem jedną ogromną różnicę, która jest konsekwencją nieudanej obsługi referencyjnej. Problem polega na tym, że obiekt, który serializujemy, jest już Listą. Jednak nie znalazłem w twoim interfejsie API możliwości określenia, że ​​śledzenie referencji powinno być włączone dla tego obiektu najwyższego poziomu. Wiem tylko, że możliwe jest włączenie go na Członkach. Tak więc jednym obejściem byłoby dostarczenie klasy kontenera dla kolekcji i włączenie śledzenia odniesienia w zamkniętej kolekcji. Ale włączenie go na obiekcie najwyższego poziomu byłoby bardziej płynne. Czy to już jest możliwe? – TwinHabit

+0

@TwinHabit nie bez istotnych zmian, obawiam się - bufory protokołu absolutnie nie mają pojęcia * listy jako obiektu *, co prowadzi do wielu dziwactw. Tylko * wie o przedmiotach. Zasadniczo na drucie pojawia się "rodzic dziecko dziecko dziecko dziecko" - nigdy "lista rodziców dziecko dziecko dziecko" (jeśli widzisz co mam na myśli) –

+0

Może moglibyśmy ulepszyć bibliotekę dzięki funkcji, która w sposób przezroczysty przenosi obiekty niestandardowych typów list do dynamicznie tworzonych klas kontenerowych? Rozwiązałoby to dwa problemy: można łatwo przenosić pola z listami niestandardowymi, a także aktywować śledzenie odniesienia w obiekcie listy najwyższego poziomu. Problem, który mamy teraz, polega na tym, że będziemy musieli zmienić interfejsy klient/serwer, ponieważ niektóre metody zwracają tylko listy ... ale zobaczmy. Może uda mi się ich przekonać. – TwinHabit

5

Mieliśmy ten sam problem. My Json serializujemy dwa obiekty (z formatowaniem, wcięciem, nowymi liniami itd.), A następnie używamy prostego porównania tekstu. Powie Ci on nie tylko, że są różne, ale właśnie na tym polega różnica.