Visual Studio วิธีการจัดลำดับวัตถุจากดีบักเกอร์


90

ฉันกำลังพยายามตรวจสอบข้อบกพร่องในการถ่ายโอนข้อมูลที่ขัดข้อง (ดังนั้นฉันจึงไม่สามารถเปลี่ยนรหัสได้) ฉันมีวัตถุที่ซับซ้อนมาก (หลายพันบรรทัดในการแสดงแบบอนุกรม) และสถานะของมันไม่สอดคล้องกัน หากต้องการตรวจสอบสถานะของมุมมองดีบักเกอร์ Visual Studio จะไม่มีประโยชน์ แต่วัตถุมีสัญญาข้อมูล ฉันต้องการทำให้เป็นอนุกรมจากนั้นใช้โปรแกรมแก้ไขข้อความที่ฉันชอบเพื่อนำทางไปยังวัตถุ เป็นไปได้ไหมที่จะทำจากดีบักเกอร์?


โปรดทราบว่าหากคุณมีคลาสคอนเทนเนอร์ที่กำหนดเองหรือคลาสอื่น ๆ ที่คุณต้องการดูหลายครั้งในระหว่างการดีบัก แต่ IntelliSense และ QuickView ไม่สามารถเข้าใจได้คุณสามารถเขียนส่วนขยายสำหรับ VS ซึ่งช่วยในการแสดงคลาสที่กำหนดเองของคุณใน แก้จุดบกพร่อง
Csaba Toth

ดูเทคนิคดีๆอีกมากมายได้ [ที่นี่] ( stackoverflow.com/questions/360277/… )
Josh

คำตอบ:


89

เมื่อไม่นานมานี้ฉันได้เขียนบรรทัดเดียวนี้ทำให้เป็นอนุกรมของวัตถุไปยังไฟล์บนดิสก์ คัดลอก / วางลงในหน้าต่างทันทีของคุณและแทนที่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 เก่าต้องวางไว้แบบนี้ไม่เช่นนั้นฉันได้รับข้อผิดพลาดเกี่ยวกับไวยากรณ์นิพจน์หากใครต้องการ: System.Xml.Serialization.XmlSerializer ใหม่ (obj.GetType ()) Serialize (New System.IO .StreamWriter ("C: \ temp \ temp.txt"), obj)
Liquid Core

นี่คือความงดงาม ฉันต้องใช้ไดเร็กทอรีอื่นเนื่องจากสิทธิ์ในการเขียน แต่มันใช้งานได้ดี นำเข้าสู่ Excel และยังสวยอีกด้วย
BuddyZ

166

โชคดีที่คุณมี Json.Net ใน appdomain ของคุณแล้ว ในกรณีนี้จะปรากฏในหน้าต่างทันทีของคุณ:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)


21
หวังว่าฉันจะโหวตให้คะแนนอีกครั้งโดยเฉพาะเมื่อเทียบกับคำตอบอื่น ๆ (ขออภัยฉันไม่ต้องการเห็น XML บรรทัดอื่นในอาชีพของฉัน)
yzorg

1
หลังจากเซสชันการดีบักการทดสอบเป็นเวลานานข้อยกเว้นเกิดขึ้นในโปรแกรมของฉันก่อนที่จะสามารถเขียนผลการทดสอบหลายพันรายการลงในไฟล์ได้ฉันอยู่ในจุดพักที่มีข้อยกเว้นเกิดขึ้นและยังสามารถตรวจสอบการรวบรวมผลลัพธ์ได้ เคล็ดลับนี้ช่วยฉันได้มาก!
HAL9000

1
คุณอาจต้องใช้ Json.Net ที่อื่นด้วยเพื่อให้โหลดเมื่อคุณพยายามใช้ในหน้าต่างทันที (ตรงข้ามกับการเพิ่มข้อมูลอ้างอิง)
Evan

1
ฉันต้องเพิ่มแพ็คเกจ Newtonsoft.Json โดยใช้ Nuget และเพิ่มบรรทัดของโค้ดในวิธีการที่ฉันมีจุดพักเพื่อสร้างคลาส Newtonsoft จำลอง json.JsonArrayAttribute () เพื่อให้ทำงานได้ ทางออกที่ดีที่สุด!
Richard Moore

1
นี่คือคำตอบที่ยอดเยี่ยม ฉันใช้มันเพียงแค่การเปลี่ยนแปลงเล็กน้อยเพื่อช่วยฉันในการเดินทางไปเสริมสวย Newtonsoft.Json.JsonConvert.SerializeObject (someVariable, Newtonsoft.Json.Formatting.Indented)
Jamie

38

นี่คือส่วนขยาย Visual Studio ซึ่งจะช่วยให้คุณทำสิ่งนั้นได้:

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

คุณสามารถส่งออกเป็น JSON, XML หรือ C #


4
ดูเหมือนว่าลิงก์จะใช้งานไม่ได้ แต่นี่คือโครงการ github และคุณจะพบได้หากคุณค้นหา "Object Exporter" ในกล่องโต้ตอบ "Extensions and Updates ... " ใน Visual Studio นามสกุลดีมาก!
Niklas Söderberg

2
ขอบคุณ @Omar ความคิดที่สมบูรณ์แบบ แต่ใช้เวลานานเกินไปและหยุดนิ่งในบางกรณี
Wahid Bitar

1
เห็นด้วยกับ @WahidBitar - แนวคิดที่ยอดเยี่ยม - เหมาะสำหรับการตั้งค่าข้อมูลการทดสอบหน่วย แต่ส่วนขยายดูเหมือนจะค่อนข้างบั๊กและใช้ Visual Studio ด้วยเมื่อเกิดปัญหา!
Dib

นี่เป็นเครื่องมือที่มีประโยชน์มาก
Ashutosh Singh


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 แต่มันบอกฉันว่า "การประเมินฟังก์ชันต้องการเธรดทั้งหมดจึงจะทำงานได้" หน้าต่างทันทีแก้มัน
xvorsx

1

รูปแบบของคำตอบจาก Omar Elabd -

ไม่ฟรี แต่มีการทดลองใช้ฟรีสำหรับ 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
});

1

ฉันใช้ObjectDumper.Net 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) 

หลังจากที่คุณเข้าสู่นาฬิกาเรือนที่สอง (Serialize one) ค่านาฬิกา stringWriter จะถูกตั้งค่าเป็น obj serialized เป็น XML คัดลอกและวาง โปรดทราบว่า XML จะอยู่ในวงเล็บปีกกา {... } ดังนั้นคุณจะต้องลบออกหากคุณต้องการใช้ XML สำหรับอะไรก็ตาม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.