2010-06-02 13 views
10

Sto cercando di creare un visualizzatore debugger che mostri la gerarchia di controllo per qualsiasi Control. È stato eseguito ma ricevo l'eccezione "Tipo non contrassegnato come serializzabile".Visualizzatore debugger e "Tipo non contrassegnato come serializzabile"

Come posso superare questo? Control è un tipo di framework .NET Windows Form, non posso contrassegnarlo come serializzabile.

+1

Hanno aggiunto il [Serializable] attributo alla classe? Senza che la tua classe non possa essere serializzata. – Justin

+0

Sto scrivendo un visualizzatore debugger per le classi di framework .NET, non posso aggiungere nulla – Andrey

risposta

19

È necessario anche implementare un VisualizerObjectSource per eseguire la serializzazione personalizzata.

Esempio:

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!")); 
    } 
} 

Avrete anche bisogno di registrare il visualizzatore con l'appropriato VisualizarObjectSource, che per questo esempio potrebbe essere qualcosa di simile:

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

Ho creato un Visualizer per vedere l'origine di UltraDataSource of Infragistics con l'utilizzo di quel campione di codice e funziona benissimo. – Samuel

+1

È anche possibile inserire l'attributo DebuggerVisualizer direttamente nella classe interessata, senza la necessità di specificare il tipo di destinazione e la descrizione. – Teejay

Problemi correlati