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)

Ответ 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))