Я пытаюсь исследовать ошибку в дампе сбоя (поэтому я не могу изменить код). У меня действительно сложный объект (тысячи строк в сериализованном представлении), и его состояние непоследовательно. Чтобы исследовать его состояние, отладчик Visual Studio бесполезен. Но у объекта есть контракт с данными. Я хотел бы сериализовать его, а затем использовать мой любимый текстовый редактор для навигации по объекту. Возможно ли это сделать из отладчика?
Visual Studio как сериализовать объект из отладчика
Ответ 1
Некоторое время назад я написал эту однострочную сериализацию объекта в файл на диске. Скопируйте/вставьте его в свое окно "Немедленное" и замените obj
(на него ссылались дважды) вашим объектом. Он сохранит файл text.xml
в c:\temp
, изменит его по своему вкусу.
(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)
Хотя не ожидайте никакой магии, если объект не может быть сериализован, он выдаст исключение.
Ответ 2
С какой-либо удачей у вас уже есть Json.Net. В этом случае поместите это в окно Immediate:
Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
Ответ 3
Вот расширение Visual Studio, которое позволит вам сделать именно это:
https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f
Вы можете выводить на JSON, XML или С#
Ответ 4
Возможно, можно использовать непосредственное окно для его сериализации, а затем скопировать содержимое в ваш любимый редактор.
Другой вариант - переопределить метод ToString()
и вызывать его в режиме отладки.
Вы также можете записать содержимое в файл незадолго до сбоя или обернуть код в try/catch и затем записать файл. Я предполагаю, что вы можете определить, когда он падает.
Ответ 5
У меня есть метод расширения, который я использую:
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));
}
Ответ 6
Вариация ответа от Омара Элабда -
Это не бесплатно, но есть бесплатная пробная версия для OzCode
(https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode).
Там есть встроенный экспорт в JSON в контекстном меню, и он работает немного лучше, чем расширение Object Export (компромисс для него не бесплатный).
http://o.oz-code.com/features#export (демо)
Я знаю, что это спустя несколько лет после факта, но я оставляю здесь ответ, потому что это сработало для меня, и кто-то еще может найти его полезным.
Ответ 7
Если у вас есть циклическая ссылка, запустите ее в ближайшем окне:
Newtonsoft.Json.JsonConvert.SerializeObject(app, Newtonsoft.Json.Formatting.Indented,
new Newtonsoft.Json.JsonSerializerSettings
{
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize
});
Ответ 8
Я использую ObjectDumper.Net.
Это работает хорошо, особенно если у вас есть живое юнит-тестирование. Я могу легко просмотреть значение переменной в консоли при запуске теста, избавив меня от отладки вручную.
Это может помочь, если вы используете XUnit.
Ответ 9
Вариант ответа Алексея. Немного сложнее, но не требует записи в текстовый файл:
1) В окне немедленного ввода введите:
System.IO.StringWriter stringWriter = new System.IO.StringWriter();
2) В окне просмотра введите два часа:
a. stringWriter
b. new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj)
После того, как вы войдете во вторую часовую игру (сериализовать), значение watchWriter будет установлено в obj, сериализованное в XML. Скопируйте и вставьте его. Обратите внимание, что XML будет заключен в фигурные скобки, {...}, поэтому вам нужно будет удалить их, если вы хотите использовать XML для чего-либо.
Ответ 10
Используйте это в окне Visual Studio "Немедленно", заменив c:\directory\file.json
полным путем к файлу, в который вы хотите записать JSON и myObject
, с вашей переменной для сериализации:
System.IO.File.WriteAllText(@"c:\directory\file.json", Newtonsoft.Json.JsonConvert.SerializeObject(myObject))