2013-06-17 18 views
7

Książka CLR Via C# przedstawia prosty sposób klonowania obiektów poprzez serializację binarną.Co właściwie robi StreamingContextStates.Clone?

Określa StreamingContextStates.Clone podczas tworzenia BinaryFormatter jak tak:

var formatter = new BinaryFormatter 
{ 
    Context = new StreamingContext(StreamingContextStates.Clone) 
}; 

The documentation for StreamingContextStates.Clone mówi, że

Określa, że ​​wykres obiekt jest przebity. Użytkownicy mogą założyć, że klonowany wykres będzie nadal istniał w ramach tego samego procesu i będzie bezpieczny w dostępie do uchwytów lub innych odniesień do niezarządzanych zasobów.

Wystarczająco fair - ale tak naprawdę nie wiem, co to właściwie znaczy. W jaki sposób to faktycznie zmienia zachowanie BinaryFormatter? Czy ktokolwiek może wymieniać jakieś konkretne efekty, które używają tej flagi?

+3

Dla przypomnienia, ja ** ** silnie sugerują, że można uniknąć 'BinaryFormatter' w, no większości przypadków. Ma kilka rzeczy, gdzie jest to przydatne, ale widziałem * tak wiele * osób ma * tak wiele * bólu spowodowanych tym ... Rzeczywiście, problemy z 'BinaryFormatter' były częścią tego, dlaczego bardzo zaangażowałem się w serializację kilka lat temu –

+3

Ta właściwość jest ponownie eksponowana w 'ISerializable.GetObjectData (...)', więc technicznie każda implementacja ** mogłaby w teorii ** wybrać zrobienie czegoś innego na podstawie wartości 'StreamingContextStates'. Nie wiem, ile, jeśli w ogóle, * czy *, ale –

+0

@MarcGravell Interesujące, dzięki. (I być może ta próbka powinna zostać usunięta z CLR Via C# dla następnej edycji wtedy;) –

Odpowiedz

2

Serializacja jest przedmiotem tutaj.
MS dostarczyło "abstrakcyjną" mini-ramkę, aby umożliwić serializację obiektów.
Formater binarny to specyficzna implementacja koncepcji mini-ramy.

Deweloper może zdecydować się na użycie tych koncepcji ramowych, aby utworzyć własne niestandardowe formater - lub -
sam MS podczas tworzenia mini-ramy myśli o dalszej implementacji serializacji.

Podały więc te flagi jako część ram.

Aby odpowiedzieć na twoje pytanie: te flagi nie będą miały żadnego wpływu na formatowanie binarne, ponieważ jest już zaimplementowane jako narzędzie (jeśli chcesz) do śledzenia wykresu obiektu i po prostu konwertowania go na bajty nieprzetworzonych danych.
Jeśli utworzysz własny serializer, który w przykładzie może zapisać obiekt do bazy danych lub do pliku lub do pamięci współużytkowanej, lub cokolwiek - chcesz, aby użytkownik korzystający z serializera określił odpowiednią flagę.

Chyba że całkowicie niezrozumiany Devs MS od 2003 r .. :) (co jest możliwe!)

Powiązane problemy