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

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



답변

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

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

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


답변

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

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)


답변

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

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

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


답변

Visual Studio의 “Immediate”창에서 이것을 사용 c:\directory\file.json하여 JSON을 작성하려는 파일의 전체 경로 myObject와 직렬화 할 변수로 바꿉니다.

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


답변

내가 사용하는 확장 방법이 있습니다.

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


답변

직접 실행 창을 사용하여 직렬화 한 다음 원하는 편집기에 콘텐츠를 복사 할 수 있습니다.

또 다른 옵션은 ToString()메서드 를 재정의하고 디버그 모드에서 호출하는 것입니다.

충돌 직전에 파일에 내용을 기록하거나 코드를 try / catch로 래핑하고 파일을 작성할 수도 있습니다. 나는 당신이 그것이 언제 충돌하는지 확인할 수 있다고 가정하고 있습니다.


답변

Omar Elabd의 답변에 대한 변형-

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

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

http://o.oz-code.com/features#export (데모)

나는 이것이 사실로부터 몇 년 후라는 것을 알고 있지만 이것이 나를 위해 일했고 다른 누군가가 유용하다고 생각할 수 있기 때문에 여기에 대답을 남기고 있습니다.