【问题标题】:Visual Studio how to serialize object from debuggerVisual Studio 如何从调试器序列化对象
【发布时间】:2013-09-18 14:39:14
【问题描述】:

我正在尝试调查故障转储中的错误(因此我无法更改代码)。 我有一个非常复杂的对象(序列化表示中有数千行),它的状态是不一致的。要调查其状态,Visual Studio 调试器视图是无用的。但是该对象具有数据合同。我想序列化它,然后使用我最喜欢的文本编辑器在对象中导航。是否可以从调试器中执行?

【问题讨论】:

  • 注意,如果你有一些自定义容器类,或者其他一些你想在调试过程中多次看到的类,但是 IntelliSense 和 QuickView 无法解决,你可以为 VS 编写一个扩展这有助于在调试中显示您的自定义类。
  • 很多好的技术也可以在 [这里] (stackoverflow.com/questions/360277/…) 找到

标签: c# debugging serialization visual-studio-2012


【解决方案1】:

如果你运气好的话,你的 appdomain 中已经有了 Json.Net。在这种情况下,将其弹出到您的即时窗口中:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)

【讨论】:

  • 希望我能再次对此表示赞同,尤其是与其他答案相比。 (抱歉,我不需要在我的职业生涯中看到另一行 XML。)
  • 在很长的测试调试会话之后,我的程序中发生了一个异常,然后它才能将数千个测试结果写入文件,我在一个发生异常的断点上,仍然可以检查结果集合.这个技巧为我节省了很多时间!
  • 您可能还需要在其他地方实际使用 Json.Net,以便在您尝试在即时窗口中使用它时加载它(而不是仅仅添加引用)。
  • 我必须使用 Nuget 添加 Newtonsoft.Json 包,并在我有断点的方法中添加一行代码来创建一个虚拟 Newtonsoft.Json.JsonArrayAttribute() 类来获取它工作。一个最优秀的解决方案!
  • 这是一个很好的答案。我只需稍作改动就可以使用它来节省我去美化器的旅行。 Newtonsoft.Json.JsonConvert.SerializeObject(someVariable, Newtonsoft.Json.Formatting.Indented)
【解决方案2】:

前段时间我写了这个单行序列化对象到磁盘上的文件。将其复制/粘贴到您的即时窗口,并用您的对象替换obj(它被引用两次)。它会将text.xml 文件保存到c:\temp,根据自己的喜好进行更改。

(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)

不要指望任何魔法,如果对象不能被序列化,它会抛出异常。

【讨论】:

  • 这在即时窗口中对我有用。赞成,
  • 当我在 VS 2015 即时窗口上使用它时,我得到这个“错误”:“不支持在此上下文中评估本机方法。”想法?
  • 当我运行它时,我收到以下消息:identifier "System" is undefined
  • 有一个旧的 VB.NET 项目,必须这样说,否则如果有人需要,我会收到有关表达式语法的错误:new System.Xml.Serialization.XmlSerializer(obj.GetType() ).Serialize(New System.IO.StreamWriter("C:\temp\temp.txt"), obj)
  • 这太壮观了。由于写权限,我不得不使用不同的目录,但它就像一个魅力。导入 Excel 就更漂亮了。
【解决方案3】:

这是一个 Visual Studio 扩展,可以让您做到这一点:

https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f

您可以输出为 JSON、XML 或 C#

【讨论】:

  • 该链接似乎已损坏,但here 是 github 项目,如果在 Visual Studio 的“扩展和更新...”对话框中搜索“对象导出器”,您可以找到它.顺便说一句,很棒的扩展!
  • 谢谢@Omar 这个想法很完美。但是在某些情况下需要很长时间并且会冻结
  • 同意@WahidBitar - 很棒的概念 - 非常适合设置单元测试数据,但扩展似乎有很多错误,并且在崩溃时会带上 Visual Studio!
  • 这真是一个非常有用的工具。
【解决方案4】:

由于.NET Core 3.0 ,您可以使用System.Text.Json

System.Text.Json.JsonSerializer.Serialize(obj)

【讨论】:

    【解决方案5】:

    在 Visual Studio 的“立即”窗口中使用它,将 c:\directory\file.json 替换为您要写入 JSON 的文件的完整路径,并将 myObject 替换为您要序列化的变量:

    System.IO.File.WriteAllText(@"c:\directory\file.json", Newtonsoft.Json.JsonConvert.SerializeObject(myObject))
    

    【讨论】:

      【解决方案6】:

      我有一个我使用的扩展方法:

      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));
      }
      

      【讨论】:

        【解决方案7】:

        可以使用即时窗口对其进行序列化,然后将内容复制到您喜欢的编辑器中。

        另一种选择是覆盖ToString() 方法并在调试模式下调用它。

        您还可以在崩溃前不久将内容写入文件,或者将代码包装到 try/catch 中然后写入文件。我假设您可以识别它何时崩溃。

        【讨论】:

        • 谢谢,我在 Watch 窗口中尝试了相同的操作,但它告诉我“函数评估需要所有线程都运行。”立即窗口解决它
        【解决方案8】:

        Omar Elabd 答案的变体——

        它不是免费的,但有 OzCode 的免费试用版
        (https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode)。

        那里的上下文/悬停菜单中有内置的 JSON 导出功能,它比 Object Export 扩展好一点(权衡它不是免费的)。

        http://o.oz-code.com/features#export(演示)

        我知道这是事后几年的事,但我在这里留下答案,因为这对我有用,其他人可能会觉得它有用。

        【讨论】:

        • 看起来很有希望,但对我一点用都没有。
        【解决方案9】:

        如果您有循环引用,请在直接窗口中运行:

        Newtonsoft.Json.JsonConvert.SerializeObject(app, Newtonsoft.Json.Formatting.Indented,
        new Newtonsoft.Json.JsonSerializerSettings
        {
            ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize
        });
        

        【讨论】:

          【解决方案10】:

          我一直在使用ObjectDumper.Net

          它运行良好,尤其是在您进行实时单元测试的情况下。当测试运行时,我可以在控制台中轻松查看变量的值,从而避免手动调试。

          如果您使用 XUnit,This 可能会有所帮助。

          【讨论】:

            【解决方案11】:

            Alexey 答案的变体。稍微复杂一些,但不涉及写入文本文件:

            1) 在即时窗口中输入:

            System.IO.StringWriter stringWriter = new System.IO.StringWriter();  
            

            2) 在 Watch Window 中输入两个手表:

            a.  stringWriter
            
            b.  new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj) 
            

            进入第二个监视(序列化)后,stringWriter 监视值将设置为 obj 序列化为 XML。复制并粘贴它。请注意,XML 将包含在花括号 {...} 中,因此如果您想将 XML 用于任何内容,则需要将其删除。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-03-06
              • 1970-01-01
              • 1970-01-01
              • 2012-05-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多