Visual Studio, як серіалізувати об'єкт з налагоджувача


88

Я намагаюся розслідувати помилку в дамп аварійного завершення роботи (тому я не можу змінити код). У мене справді складний об'єкт (тисячі рядків у серіалізованому поданні), і його стан суперечливий. Для дослідження його стану подання налагоджувача Visual Studio марно. Але об’єкт має контракт даних. Я хотів би його серіалізувати, а потім скористатися улюбленим текстовим редактором для навігації по об’єкту. Чи можна це зробити з налагоджувача?


Зверніть увагу, що якщо у вас є якийсь власний клас контейнера або якийсь інший клас, що ви хочете бачити багато разів під час налагодження, але IntelliSense і QuickView не можуть це зрозуміти, ви можете написати розширення для VS, яке допоможе показати ваш власний клас у відлагоджувати.
Csaba Toth

Багато хороших прийомів також можна знайти [тут] ( stackoverflow.com/questions/360277/… )
Джош

Відповіді:


86

Деякий час тому я написав цей однорядковий рядок, серіалізуючи об'єкт у файл на диску. Скопіюйте / вставте його у своє негайне вікно та замініть obj(на нього вказано двічі) вашим об’єктом. Він збереже text.xmlфайл у c:\temp, змінить його на свій смак.

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

Не очікуйте жодної магії, якщо об’єкт не можна серіалізувати, він викличе виняток.


3
Це спрацювало для мене у безпосередньому вікні. підтриманий,
Кумар

1
коли я використовую це у безпосередньому вікні VS 2015, я отримую таку "помилку": "Оцінка власних методів у цьому контексті не підтримується." Ідеї?
Vetras

Коли я запускаю його, я отримую таке повідомлення:identifier "System" is undefined
Rasoul

Був старий проект VB.NET, я повинен був це висловити так, інакше я отримував помилку про синтаксис виразів, якщо комусь потрібно: new System.Xml.Serialization.XmlSerializer (obj.GetType ()). Серіалізувати (New System.IO .StreamWriter ("C: \ temp \ temp.txt"), obj)
Liquid Core

Це вражаюче. Мені довелося використовувати інший каталог через дозволи на запис, але це працювало як принада. Імпортуйте в Excel, і це навіть досить.
BuddyZ

160

Якщо пощастить, у вас вже є Json.Net у вашому додатковому домені. У такому випадку вставте це у своє негайне вікно:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)


19
Хотілося б, щоб я знову підтримав це, особливо в порівнянні з іншими відповідями. (Вибачте, але мені не потрібно бачити ще один рядок XML у своїй кар'єрі.)
yzorg

1
Після дуже тривалого сеансу налагодження тесту в моїй програмі стався виняток, перш ніж вона змогла записати тисячі результатів тесту у файл, я опинився на точці зупинки, де відбулося виняток, і все ще міг перевірити збір результатів. Ця підказка заощадила мені багато часу!
HAL9000

1
Можливо, вам доведеться фактично використовувати Json.Net де-небудь ще, щоб він завантажувався, коли ви намагаєтесь використовувати його у вікні Негайне (на відміну від простого додавання посилання).
Еван,

1
Мені довелося додати пакет Newtonsoft.Json за допомогою Nuget, а також додати рядок коду в методі, в якому я мав точку зупинки, щоб створити фіктивний клас Newtonsoft.Json.JsonArrayAttribute (), щоб він запрацював. Відмінне рішення!
Річард Мур,

1
Це чудова відповідь. Я використовую його з невеликою зміною, щоб заощадити поїздку до краси. Newtonsoft.Json.JsonConvert.SerializeObject (someVariable, Newtonsoft.Json.Formatting.Indented)
Джеймі

37

Ось розширення Visual Studio, яке дозволить вам зробити саме це:

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

Ви можете виконати вихід у JSON, XML або C #


4
Здається, це посилання порушено, але ось проект github, і ви можете знайти його, якщо шукати "Експортер об'єктів" у діалоговому вікні "Розширення та оновлення ..." у Visual Studio. Чудове розширення до речі!
Ніклас Сьодерберг,

2
Дякую @Omar Ідея ідеальна. Але це займає занадто багато часу і в деяких випадках замерзає
Вахід Бітар

1
Погоджено з @WahidBitar - Чудова концепція - ідеально підходить для налаштування даних модульних тестів, але розширення здається досить помилковим, і він бере Visual Studio із собою при аварії!
Діб

Це дійсно дуже корисний інструмент.
Ашутош Сінгх


4

Використовуйте це у вікні "Безпосереднє" Visual Studio, замінюючи c:\directory\file.json повним шляхом до файлу, до якого ви хочете написати JSON, та myObjectзмінною для серіалізації:

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

3

У мене є метод розширення, який я використовую:

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

Я перевантажую його рядком для saveTo і викликаю з безпосереднього вікна:

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

3

Можливо, можна скористатися безпосереднім вікном для його серіалізації, а потім скопіювати вміст у ваш улюблений редактор.

Інший варіант - замінити ToString()метод і викликати його в режимі налагодження.

Ви також можете записати вміст у файл незадовго до збою, або обернути код у функцію try / catch і записати файл. Я припускаю, що ви можете визначити, коли він аварійно завершує роботу.


Дякую, я спробував те саме з вікна Watch, але мені сказали: "Оцінка функції вимагає запуску всіх потоків." Негайне вікно це вирішить
xvorsx

1

Варіація відповіді від Омара Елабда -

Це не безкоштовно, але для OzCode існує безкоштовна пробна версія
( https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode ).

Там є вбудований експорт до JSON в контекстному меню / наведенні меню, і він працює дещо краще, ніж розширення Object Export (компроміс за це не є безкоштовним).

http://o.oz-code.com/features#export (демо)

Я знаю, що це через кілька років після цього, але я залишаю тут відповідь, тому що це спрацювало для мене, і комусь іншому це може стати в нагоді.


1

Якщо у вас є кругове посилання, запустіть це в безпосередньому вікні:

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

1

Я використовую ObjectDumper.Net .

Це працює добре, особливо якщо у вас є модульне тестування. Я легко переглядаю значення змінної в консолі під час запуску тесту, позбавляючи мене від налагодження вручну.

Це може допомогти, якщо ви використовуєте XUnit.


0

Варіація відповіді Олексія. Трохи складніше, але не передбачає запису в текстовий файл:

1) У вікні негайного введення введіть:

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

2) У Вікно спостереження введіть два годинники:

a.  stringWriter

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

Після того, як ви введете другий годинник (серіалізаційний), значення перегляду stringWriter буде встановлено як obj, серіалізований на XML. Скопіюйте та вставте його. Зверніть увагу, що XML буде укладено у фігурні дужки, {...}, тому вам потрібно буде їх видалити, якщо ви хочете використовувати XML для чого-небудь.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.