2010-06-02 30 views
10

Tôi đang cố gắng tạo trình hiển thị trình gỡ lỗi sẽ hiển thị phân cấp điều khiển cho bất kỳ Control nào. Đã xong nhưng tôi nhận được ngoại lệ "Loại không được đánh dấu là có thể tuần tự hóa".Trình gỡ lỗi trình gỡ lỗi và "Loại không được đánh dấu là có thể tuần tự hóa"

Làm cách nào để khắc phục điều đó? Kiểm soát là một loại khuôn khổ .NET Windows Forms, tôi không thể đánh dấu nó là serializable.

+1

Bạn đã thêm [Serializable] thuộc tính cho lớp học? Nếu không có lớp học của bạn không thể được tuần tự hóa. – Justin

+0

Tôi đang viết trình hiển thị trình gỡ rối cho các lớp .NET framework, tôi không thể thêm bất kỳ thứ gì – Andrey

Trả lời

19

Bạn cũng cần phải triển khai VisualizerObjectSource để thực hiện tuần tự hóa tùy chỉnh.

Ví dụ:

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

Bạn cũng sẽ cần phải đăng ký visualizer với chiếm đoạt VisualizarObjectSource, mà ví dụ này có thể là một cái gì đó như thế này:

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

Tôi đã tạo Visualizer để xem nguồn UltraDataSource của Infragistics bằng cách sử dụng mẫu mã đó và nó hoạt động tốt. – Samuel

+1

Bạn cũng có thể đặt thuộc tính DebuggerVisualizer trực tiếp trên lớp quan tâm, mà không cần phải chỉ định loại Target và Description. – Teejay

Các vấn đề liên quan