2010-06-02 10 views
10

Próbuję utworzyć wizualizator debuggera, który będzie pokazywał hierarchię kontroli dla dowolnego Control. Zrobione, ale otrzymuję wyjątek "Typ nie jest oznaczony jako możliwy do serializacji".Wizualizator debuggera i "Typ nie jest oznaczony jako możliwy do serializacji"

Jak mogę to pokonać? Control to typ struktury .NET Windows Forms, nie można go oznaczyć jako możliwy do serializacji.

+1

byłaś dodał [Serializable] przypisać do klasy? Bez tego twoja klasa nie może być serializowana. – Justin

+0

Piszę wizualizator debuggera dla klas architektury .NET, nie mogę nic dodać. – Andrey

Odpowiedz

19

Aby wykonać niestandardową serializację, musisz również zaimplementować VisualizerObjectSource.

Przykład:

public class ControlVisualizerObjectSource : VisualizerObjectSource 
{ 
    public override void GetData(object target, Stream outgoingData) 
    { 
     var writer = new StreamWriter(outgoingData); 
     writer.WriteLine(((Control)target).Text); 
     writer.Flush(); 
    } 
} 
public class ControlVisualizer : DialogDebuggerVisualizer 
{ 
    protected override void Show(
     IDialogVisualizerService windowService, 
     IVisualizerObjectProvider objectProvider) 
    { 
     string text = new StreamReader(objectProvider.GetData()).ReadLine(); 
    } 
    public static void TestShowVisualizer(object objectToVisualize) 
    { 
     var visualizerHost = new VisualizerDevelopmentHost(
      objectToVisualize, 
      typeof(ControlVisualizer), 
      typeof(ControlVisualizerObjectSource)); 
     visualizerHost.ShowVisualizer(); 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     ControlVisualizer.TestShowVisualizer(new Control("Hello World!")); 
    } 
} 

Trzeba także zarejestrować wizualizera z przywłaszczył VisualizarObjectSource, który w tym przykładzie może być coś takiego:

[assembly: DebuggerVisualizer(
    typeof(ControlVisualizer), 
    typeof(ControlVisualizerObjectSource), 
    Target = typeof(System.Windows.Forms.Control), 
    Description = "Control Visualizer")] 
+1

Stworzyłem wizualizator, aby zobaczyć źródło UltraDataSource of Infragistics z użyciem tej próbki kodu i działa świetnie. – Samuel

+1

Możesz także umieścić atrybut DebuggerVisualizer bezpośrednio na zainteresowanej klasie, bez potrzeby określania typu celu i opisu. – Teejay

Powiązane problemy