Estou tentando investigar um bug em um despejo de memória (portanto, não posso alterar o código). Tenho um objeto realmente complicado (milhares de linhas na representação serializada) e seu estado é inconsistente. Para investigar seu estado, a visualização do depurador do Visual Studio é inútil. Mas o objeto tem um contrato de dados. Gostaria de serializá-lo e usar meu editor de texto favorito para navegar pelo objeto. É possível fazer a partir do depurador?
88
Respostas:
Algum tempo atrás eu escrevi este one-liner serializando um objeto para um arquivo no disco. Copie / cole na janela Immediate e substitua
obj
(é referenciado duas vezes) pelo seu objeto. Ele salvará umtext.xml
arquivo emc:\temp
, altere-o ao seu gosto.(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)
Não espere nenhuma mágica, porém, se o objeto não puder ser serializado, ele lançará uma exceção.
fonte
identifier "System" is undefined
Com alguma sorte, você já tem Json.Net em seu appdomain. Nesse caso, coloque-o na janela Imediata:
Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
fonte
Aqui está uma extensão do Visual Studio que permitirá que você faça exatamente isso:
https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f
Você pode enviar para JSON, XML ou C #
fonte
Use isso na janela "Imediata" do Visual Studio, substituindo
c:\directory\file.json
pelo caminho completo para o arquivo no qual você gostaria de escrever o JSON emyObject
pela sua variável para serializar:System.IO.File.WriteAllText(@"c:\directory\file.json", Newtonsoft.Json.JsonConvert.SerializeObject(myObject))
fonte
Tenho um método de extensão que uso:
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); } }
Eu o sobrecarrego com uma string para saveTo e o chamo da janela imediata:
public static void ToSerializedObjectForDebugging(this object o, string saveTo) { ToSerializedObjectForDebugging(o, new FileInfo(saveTo)); }
fonte
Pode ser possível usar a janela imediata para serializá-lo e, em seguida, copiar o conteúdo para seu editor favorito.
Outra opção é substituir o
ToString()
método e chamá-lo enquanto estiver no modo de depuração.Você também pode gravar o conteúdo em um arquivo logo antes do travamento ou agrupar o código em um try / catch e gravar o arquivo então. Presumo que você possa identificar quando ele está travando.
fonte
Uma variação da resposta de Omar Elabd -
Não é gratuito, mas existe uma versão de avaliação gratuita do OzCode
( https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode ).
Há exportação embutida para JSON dentro do menu context / hover lá, e funciona um pouco melhor do que a extensão Object Export (a compensação por não ser gratuita).
http://o.oz-code.com/features#export (demo)
Sei que isso aconteceu alguns anos depois do ocorrido, mas estou deixando uma resposta aqui porque funcionou para mim e outra pessoa pode achar útil.
fonte
Caso você tenha uma referência circular, execute-a na janela imediata:
Newtonsoft.Json.JsonConvert.SerializeObject(app, Newtonsoft.Json.Formatting.Indented, new Newtonsoft.Json.JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize });
fonte
Tenho usado ObjectDumper.Net .
Funciona bem, especialmente se você tiver testes de unidade ao vivo. Posso visualizar facilmente o valor de uma variável no console quando um teste é executado, evitando a depuração manual.
Isso pode ajudar se você estiver usando o XUnit.
fonte
Uma variação da resposta de Alexey. Um pouco mais complicado, mas não envolve gravar em um arquivo de texto:
1) Na janela imediata, digite:
System.IO.StringWriter stringWriter = new System.IO.StringWriter();
2) Na janela de observação, insira duas vigias:
a. stringWriter b. new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj)
Depois de inserir a segunda observação (a Serializar), o valor da observação stringWriter será definido como obj serializado para XML. Copie e cole. Observe que o XML estará entre colchetes, {...}, portanto, você precisará removê-los se quiser usar o XML para qualquer coisa.
fonte