Visual Studio как сериализовать объект из отладчика

88

Я пытаюсь исследовать ошибку в аварийном дампе (поэтому не могу изменить код). У меня действительно сложный объект (тысячи строк в сериализованном представлении), и его состояние несовместимо. Чтобы исследовать его состояние, представление отладчика Visual Studio бесполезно. Но у объекта есть контракт данных. Я хотел бы сериализовать его, а затем использовать мой любимый текстовый редактор для навигации по объекту. Можно ли из отладчика сделать?

xvorsx
источник
Обратите внимание, что если у вас есть какой-то настраиваемый класс контейнера или какой-либо другой класс, который вы хотите видеть много раз во время отладки, но IntelliSense и QuickView не могут понять это, вы можете написать расширение для VS, которое помогает отображать ваш настраиваемый класс в отлаживать.
Csaba Toth
Многие хорошие методы также можно найти [здесь] ( stackoverflow.com/questions/360277/… )
Джош

Ответы:

86

Некоторое время назад я написал однострочную сериализацию объекта в файл на диске. Скопируйте / вставьте его в свое окно Immediate и замените 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 ()). Serialize (New System.IO .StreamWriter ("C: \ temp \ temp.txt"), obj)
Liquid Core
Это потрясающе. Мне пришлось использовать другой каталог из-за разрешений на запись, но это работало как шарм. Импортируйте в Excel и это даже красиво.
BuddyZ
160

Если повезет, у вас уже есть Json.Net в вашем домене приложения. В этом случае вставьте это в свое немедленное окно:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)

mcintyre321
источник
19
Хотел бы я снова проголосовать за это, особенно по сравнению с другими ответами. (Извините, но мне не нужно видеть еще одну строчку XML в моей карьере.)
yzorg
1
После очень долгого сеанса тестовой отладки в моей программе произошло исключение, прежде чем она смогла записать тысячи результатов теста в файл, я был на точке останова, где возникло исключение, и все еще мог проверить коллекцию результатов. Этот совет сэкономил мне много времени!
HAL9000 01
1
Возможно, вам придется использовать Json.Net где-то еще, чтобы он загружался, когда вы пытаетесь использовать его в окне Immediate (в отличие от простого добавления ссылки).
Эван
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 при сбое!
Dib
Это действительно очень полезный инструмент.
Ашутош Сингх
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, но он сказал мне: «Оценка функции требует, чтобы все потоки работали». Немедленное окно
реши
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
});
InGeek
источник
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) 

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

Саймон Тевси
источник