Visual Studio cách tuần tự hóa đối tượng từ trình gỡ lỗi


88

Tôi đang cố gắng điều tra một lỗi trong kết xuất sự cố (vì vậy tôi không thể thay đổi mã). Tôi có một đối tượng thực sự phức tạp (hàng nghìn dòng trong biểu diễn được tuần tự hóa) và trạng thái của nó không nhất quán. Để điều tra trạng thái của nó, chế độ xem trình gỡ lỗi Visual Studio là vô dụng. Nhưng đối tượng có một hợp đồng dữ liệu. Tôi muốn tuần tự hóa nó và sau đó sử dụng trình soạn thảo văn bản yêu thích của tôi để điều hướng trên đối tượng. Có thể thực hiện từ trình gỡ lỗi không?


Lưu ý rằng nếu bạn có một số lớp vùng chứa tùy chỉnh hoặc một số lớp khác mà bạn muốn xem nhiều lần trong quá trình gỡ lỗi, nhưng IntelliSense và QuickView không thể tìm ra, bạn có thể viết một phần mở rộng cho VS để giúp hiển thị lớp tùy chỉnh của bạn trong gỡ lỗi.
Csaba Toth

Nhiều kỹ thuật tốt cũng có thể được tìm thấy [ở đây] ( stackoverflow.com/questions/360277/... )
Josh

Câu trả lời:


86

Cách đây một thời gian, tôi đã viết một lớp lót này tuần tự hóa một đối tượng thành một tệp trên đĩa. Sao chép / dán nó vào cửa sổ Ngay lập tức của bạn và thay thế obj(nó được tham chiếu hai lần) bằng đối tượng của bạn. Nó sẽ lưu một text.xmltập tin vào c:\temp, thay đổi nó theo ý thích của bạn.

(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)

Tuy nhiên, đừng mong đợi bất kỳ phép thuật nào, nếu đối tượng không thể được tuần tự hóa, nó sẽ ném ra một ngoại lệ.


3
Điều này đã làm việc cho tôi trong cửa sổ ngay lập tức. ủng hộ,
Pankaj Kumar

1
khi tôi sử dụng tính năng này trên cửa sổ VS 2015 ngay lập tức, tôi nhận được 'lỗi' này: "Đánh giá các phương thức gốc trong ngữ cảnh này không được hỗ trợ." Ý tưởng?
Vetras

Khi tôi chạy nó, tôi nhận được thông báo sau:identifier "System" is undefined
Rasoul

Có một dự án VB.NET cũ, phải đặt nó như thế này nếu không, tôi gặp lỗi về cú pháp biểu thức, nếu ai đó cần: new System.Xml.Serialization.XmlSerializer (obj.GetType ()). Serialize (New System.IO .StreamWriter ("C: \ temp \ temp.txt"), obj)
Liquid Core

Thật là ngoạn mục. Tôi đã phải sử dụng một thư mục khác do quyền ghi, nhưng nó hoạt động như một sự quyến rũ. Nhập vào Excel và nó thậm chí còn đẹp.
BuddyZ

160

Nếu may mắn, bạn đã có Json.Net trong tên miền ứng dụng của mình. Trong trường hợp đó, hãy bật nó vào cửa sổ Ngay lập tức của bạn:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)


19
Ước gì tôi có thể ủng hộ điều này một lần nữa, đặc biệt là so với các câu trả lời khác. (Xin lỗi, nhưng tôi không cần phải xem một dòng XML khác trong sự nghiệp của mình.)
yzorg

1
Sau một phiên gỡ lỗi thử nghiệm rất dài, một ngoại lệ đã xảy ra trong chương trình của tôi trước khi chương trình có thể ghi ra hàng nghìn kết quả thử nghiệm vào một tệp, tôi đang ở một điểm dừng xảy ra ngoại lệ và vẫn có thể kiểm tra việc thu thập kết quả. Mẹo này đã tiết kiệm cho tôi rất nhiều thời gian!
HAL9000

1
Bạn có thể cần thực sự sử dụng Json.Net ở một nơi khác để nó được tải khi bạn cố gắng sử dụng nó trong cửa sổ Ngay lập tức (thay vì chỉ thêm tham chiếu).
Evan

1
Tôi đã phải thêm gói Newtonsoft.Json bằng cách sử dụng Nuget và cũng thêm một dòng mã trong phương thức mà tôi có điểm ngắt để tạo một lớp giả Newtonsoft.Json.JsonArrayAttribute () để nó hoạt động. Một giải pháp tuyệt vời nhất!
Richard Moore

1
Đây là một câu trả lời tuyệt vời. Tôi sử dụng nó chỉ với một khoản thay đổi nhỏ để tiết kiệm cho tôi một chuyến đi đến nơi làm đẹp. Newtonsoft.Json.JsonConvert.SerializeObject (someVariable, Newtonsoft.Json.Formatting.Indented)
Jamie

37

Đây là một tiện ích mở rộng Visual Studio sẽ cho phép bạn thực hiện chính xác điều đó:

https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f

Bạn có thể xuất ra JSON, XML hoặc C #


4
Liên kết đó dường như đã bị hỏng, nhưng đây là dự án github và bạn có thể tìm thấy nó nếu bạn tìm kiếm "Object Exporter" trong hộp thoại "Extensions and Updates ..." trong Visual Studio. Phần mở rộng tuyệt vời btw!
Niklas Söderberg

2
Cảm ơn bạn @Omar Ý tưởng thật hoàn hảo. Nhưng phải mất thời gian quá dài và đóng băng trong một số trường hợp
Wahid Bitar

1
Đồng ý với @WahidBitar - Khái niệm tuyệt vời - hoàn hảo để thiết lập dữ liệu kiểm tra đơn vị, nhưng tiện ích mở rộng này có vẻ khá lỗi và phải sử dụng Visual Studio khi nó gặp sự cố!
Dib

Đây thực sự là một công cụ rất hữu ích.
Ashutosh Singh


4

Sử dụng điều này trong cửa sổ "Ngay lập tức" của Visual Studio, thay thế c:\directory\file.jsonbằng đường dẫn đầy đủ đến tệp mà bạn muốn ghi JSON và myObjectvới biến của bạn để tuần tự hóa:

System.IO.File.WriteAllText(@"c:\directory\file.json", Newtonsoft.Json.JsonConvert.SerializeObject(myObject))

3

Tôi có một phương pháp mở rộng mà tôi sử dụng:

public static void ToSerializedObjectForDebugging(this object o, FileInfo saveTo)
{
    Type t = o.GetType();
    XmlSerializer s = new XmlSerializer(t);
    using (FileStream fs = saveTo.Create())
    {
        s.Serialize(fs, o);
    }
}

Tôi nạp chồng nó bằng một chuỗi cho saveTo và gọi nó từ cửa sổ ngay lập tức:

public static void ToSerializedObjectForDebugging(this object o, string saveTo)
{
    ToSerializedObjectForDebugging(o, new FileInfo(saveTo));
}

3

Có thể sử dụng cửa sổ ngay lập tức để tuần tự hóa nó và sau đó sao chép nội dung vào trình soạn thảo yêu thích của bạn.

Một tùy chọn khác là ghi đè ToString()phương thức và gọi nó khi ở chế độ gỡ lỗi.

Bạn cũng có thể ghi nội dung ra tệp ngay trước khi xảy ra sự cố hoặc bọc mã vào thử / bắt và sau đó ghi tệp. Tôi cho rằng bạn có thể xác định khi nào nó gặp sự cố.


Cảm ơn, tôi đã thử tương tự từ cửa sổ Watch, nhưng nó cho tôi biết "Đánh giá chức năng yêu cầu tất cả các luồng chạy." Cửa sổ ngay lập tức giải quyết nó
xvorsx

1

Một biến thể về câu trả lời từ Omar Elabd -

Nó không miễn phí, nhưng có một bản dùng thử miễn phí cho OzCode
( https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode ).

Có tích hợp tính năng xuất sang JSON trong menu ngữ cảnh / di chuột ở đó và nó hoạt động tốt hơn một chút so với tiện ích mở rộng Object Export (sự đánh đổi cho việc nó không được miễn phí).

http://o.oz-code.com/features#export (demo)

Tôi biết điều này là một vài năm sau thực tế, nhưng tôi để lại câu trả lời ở đây vì điều này hiệu quả với tôi và ai đó có thể thấy nó hữu ích.


1

Trong trường hợp bạn có tham chiếu vòng tròn, hãy chạy điều này trong Cửa sổ ngay lập tức:

Newtonsoft.Json.JsonConvert.SerializeObject(app, Newtonsoft.Json.Formatting.Indented,
new Newtonsoft.Json.JsonSerializerSettings
{
    ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize
});

1

Tôi đã sử dụng ObjectDumper.Net .

Nó hoạt động tốt, đặc biệt nếu bạn có thử nghiệm đơn vị trực tiếp. Tôi có thể dễ dàng xem giá trị của một biến trong bảng điều khiển khi chạy thử nghiệm, giúp tôi không phải gỡ lỗi theo cách thủ công.

Điều này có thể hữu ích nếu bạn đang sử dụng XUnit.


0

Một biến thể trong câu trả lời của Alexey. Hơi phức tạp hơn một chút nhưng không liên quan đến việc ghi vào tệp văn bản:

1) Trong Cửa sổ ngay lập tức, hãy nhập:

System.IO.StringWriter stringWriter = new System.IO.StringWriter();  

2) Trong Cửa sổ theo dõi, hãy nhập hai đồng hồ:

a.  stringWriter

b.  new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj) 

Sau khi bạn nhập đồng hồ thứ hai (số tự động hóa một), giá trị đồng hồ stringWriter sẽ được đặt thành obj được tuần tự hóa thành XML. Sao chép và dán nó. Lưu ý rằng XML sẽ được đặt trong dấu ngoặc nhọn, {...}, vì vậy bạn sẽ cần phải xóa chúng nếu muốn sử dụng XML cho bất kỳ việc gì.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.