Visual Studio 디버거에서 개체를 직렬화하는 방법


88

크래시 덤프에서 버그를 조사하려고합니다 (코드를 변경할 수 없음). 정말 복잡한 객체 (직렬화 된 표현의 수천 줄)가 있고 그 상태가 일치하지 않습니다. 상태를 조사하기 위해 Visual Studio 디버거 뷰는 쓸모가 없습니다. 그러나 개체에는 데이터 계약이 있습니다. 직렬화 한 다음 좋아하는 텍스트 편집기를 사용하여 개체를 탐색하고 싶습니다. 디버거에서 할 수 있습니까?


사용자 지정 컨테이너 클래스가 있거나 디버그 중에 여러 번보고 싶은 다른 클래스가 있지만 IntelliSense 및 QuickView가이를 파악할 수없는 경우 사용자 지정 클래스를 표시하는 데 도움이되는 VS 용 확장을 작성할 수 있습니다. 디버그.
Csaba Toth 2013 년

[여기]에서 많은 좋은 기술을 찾을 수도 있습니다 ( stackoverflow.com/questions/360277/… )
Josh

답변:


86

얼마 전에 디스크의 파일에 개체를 직렬화하는이 한 줄짜리를 작성했습니다. 직접 실행 창에 복사 / 붙여 넣기하고 obj(두 번 참조 됨) 개체로 바꿉니다. text.xml파일을에 저장하고 c:\temp원하는대로 변경합니다.

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

그러나 어떤 마법도 기대하지 마십시오. 객체를 직렬화 할 수 없으면 예외가 발생합니다.


3
이것은 즉각적인 창에서 나를 위해 일했습니다. upvoted,
Pankaj Kumar

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

운이 좋으면 이미 appdomain에 Json.Net이 있습니다. 이 경우 직접 실행 창에 다음을 표시합니다.

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)


19
특히 다른 답변과 비교하여 이것을 다시 찬성 할 수 있기를 바랍니다. (미안하지만, 나는 내 경력에서 XML의 또 다른 라인을 참조 할 필요가 없습니다.)
yzorg

1
매우 긴 테스트 디버그 세션 후 수천 개의 테스트 결과를 파일에 기록하기 전에 내 프로그램에서 예외가 발생했습니다. 예외가 발생한 중단 점에 있었고 여전히 결과 컬렉션을 검사 할 수있었습니다. 이 팁은 저에게 많은 시간을 절약했습니다!
HAL9000

1
참조를 추가하는 것과는 반대로 직접 실행 창에서 사용하려고 할 때로드되도록 실제로 다른 곳에서도 Json.Net을 사용해야 할 수도 있습니다.
Evan

1
Nuget을 사용하여 Newtonsoft.Json 패키지를 추가하고 작동하도록 더미 Newtonsoft.Json.JsonArrayAttribute () 클래스를 만들기 위해 중단 점이있는 메서드에 코드 줄을 추가해야했습니다. 가장 훌륭한 솔루션!
Richard Moore

1
이것은 훌륭한 대답입니다. 나는 미인 사로의 여행을 구하기 위해 작은 변화와 함께 사용합니다. Newtonsoft.Json.JsonConvert.SerializeObject (someVariable, Newtonsoft.Json.Formatting.Indented)
Jamie

37

다음은 정확하게 수행 할 수있는 Visual Studio 확장입니다.

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

JSON, XML 또는 C #으로 출력 할 수 있습니다.


4
링크가 끊어진 것 같지만 여기 에 github 프로젝트가 있으며 Visual Studio의 "확장 및 업데이트 ..."대화 상자에서 "개체 내보내기"를 검색하면 찾을 수 있습니다. 훌륭한 확장 btw!
Niklas Söderberg

2
@Omar 감사합니다 아이디어는 완벽합니다. 그러나 어떤 경우에는 너무 긴 시간과 동결 소요
와히드 비 타르에게

1
@WahidBitar와 동의-훌륭한 개념-단위 테스트 데이터를 설정하는 데 적합하지만 확장은 상당히 버그가있는 것처럼 보이며 충돌시 Visual Studio를 사용합니다!
Dib

이것은 정말 매우 유용한 도구입니다.
Ashutosh Singh


4

Visual Studio의 "Immediate"창에서 이것을 사용 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 창에서도 똑같이 시도했지만 "함수 평가에는 모든 스레드가 실행되어야합니다."라는 메시지가 표시됩니다. 즉시 창 해결
xvorsx 2013-09-13

1

Omar Elabd의 답변에 대한 변형-

무료는 아니지만 OzCode
( https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode )에 대한 무료 평가판이 있습니다.

컨텍스트 / 호버 메뉴 내에 JSON으로 내보내기가 내장되어 있으며 개체 내보내기 확장 프로그램보다 약간 더 잘 작동합니다 (무료가 아니라는 단점).

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

1

ObjectDumper.Net을 사용 하고 있습니다. 있습니다.

특히 라이브 단위 테스트가있는 경우 잘 작동합니다. 테스트가 실행될 때 콘솔에서 변수 값을 쉽게 볼 수 있으므로 수동으로 디버깅하지 않아도됩니다.

XUnit을 사용하는 경우 도움 될 수 있습니다.


0

Alexey의 답변에 대한 변형. 약간 더 복잡하지만 텍스트 파일에 쓰는 것은 포함되지 않습니다.

1) 직접 실행 창에 다음을 입력합니다.

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

2) 조사 식 창에 두 개의 시계를 입력하십시오.

a.  stringWriter

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

두 번째 감시 (직렬화)를 입력하면 stringWriter 감시 값이 XML로 직렬화 된 obj로 설정됩니다. 복사하여 붙여 넣으십시오. XML은 중괄호 ({...})로 묶여 있으므로 XML을 사용하려는 경우 제거해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.