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