Visual Studio hata ayıklayıcıdan nesneyi seri hale getirme


90

Çökme dökümündeki bir hatayı araştırmaya çalışıyorum (bu yüzden kodu değiştiremiyorum). Gerçekten karmaşık bir nesnem var (serileştirilmiş gösterimde binlerce satır) ve durumu tutarsız. Durumunu araştırmak için Visual Studio hata ayıklayıcı görünümü işe yaramaz. Ancak nesnenin bir veri sözleşmesi var. Bunu serileştirmek ve ardından nesne üzerinde gezinmek için en sevdiğim metin düzenleyiciyi kullanmak istiyorum. Hata ayıklayıcıdan yapmak mümkün mü?


Bazı özel kapsayıcı sınıfınız veya hata ayıklama sırasında birçok kez görmek istediğiniz başka bir sınıfınız varsa, ancak IntelliSense ve QuickView bunu çözemezse, özel sınıfınızı içinde göstermeye yardımcı olacak bir VS uzantısı yazabilirsiniz. hata ayıklama.
Csaba Toth

Birçok iyi teknik de [burada] bulunabilir ( stackoverflow.com/questions/360277/… )
Josh

Yanıtlar:


89

Bir süre önce, bir nesneyi diskteki bir dosyaya serileştiren bu tek satırlık yazıyı yazdım. Hemen pencerenize kopyalayın / yapıştırın ve obj(iki kez başvurulur) nesnenizle değiştirin. Bir text.xmldosya kaydedecek c:\temp, beğeninize göre değiştirecektir.

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

Yine de herhangi bir sihir beklemeyin, eğer nesne serileştirilemezse, bir istisna atar.


3
Bu hemen pencerede benim için çalıştı. olumlu oy verildi,
Pankaj Kumar

1
Bunu VS 2015 hemen penceresinde kullandığımda, şu 'hatayı' alıyorum: "Bu bağlamda yerel yöntemlerin değerlendirilmesi desteklenmiyor." Fikirler?
Vetras

Çalıştırdığımda şu mesajı alıyorum:identifier "System" is undefined
Rasoul

Eski bir VB.NET projem vardı, bunu böyle koymak zorunda kaldım, aksi takdirde birinin ihtiyacı olursa ifade sözdizimi hakkında bir hata alıyordum: new System.Xml.Serialization.XmlSerializer (obj.GetType ()). Serialize (New System.IO .StreamWriter ("C: \ temp \ temp.txt"), obj)
Liquid Core

Bu muhteşem. Yazma izinleri nedeniyle farklı bir dizin kullanmak zorunda kaldım, ancak bir cazibe gibi çalıştı. Excel'e aktarın ve hatta güzel.
BuddyZ

164

Şansınız varsa, uygulama alanınızda zaten Json.Net var. Bu durumda bunu Hemen pencerenize açın:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)


20
Keşke bunu, özellikle diğer yanıtlarla karşılaştırıldığında, tekrar yükseltebilseydim. (Üzgünüm ama kariyerimde başka bir XML satırı görmeme gerek yok.)
yzorg

1
Çok uzun bir test hata ayıklama oturumundan sonra, programımda bir dosyaya binlerce test sonucunu yazmadan önce bir istisna meydana geldi, istisnanın meydana geldiği bir kırılma noktasındaydım ve hala sonuç koleksiyonunu inceleyebiliyordum. Bu ipucu bana çok zaman kazandırdı!
HAL9000

1
Hemen Json.Net'i başka bir yerde de kullanmanız gerekebilir, böylece onu Hemen penceresinde kullanmaya çalıştığınızda (sadece referans eklemenin aksine) yüklenir.
Evan

1
Newtonsoft.Json paketini Nuget kullanarak eklemem ve ayrıca işe yaraması için kukla bir Newtonsoft.Json.JsonArrayAttribute () sınıfı oluşturmak için kesme noktasının bulunduğu yönteme bir kod satırı eklemem gerekiyordu. En mükemmel çözüm!
Richard Moore

1
Bu harika bir cevap. Beni güzelleştiriciye bir yolculuktan kurtarmak için sadece küçük bir değişiklikle kullanıyorum. Newtonsoft.Json.JsonConvert.SerializeObject (someVariable, Newtonsoft.Json.Formatting.Indented)
Jamie

37

İşte tam olarak bunu yapmanıza izin verecek bir Visual Studio uzantısı:

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

JSON, XML veya C # olarak çıktı alabilirsiniz


4
Bu bağlantı kopmuş gibi görünüyor, ancak işte github projesi ve Visual Studio'daki "Uzantılar ve Güncellemeler ..." iletişim kutusunda "Nesne Dışa Aktarıcı" yı ararsanız bulabilirsiniz. Büyük uzatma btw!
Niklas Söderberg

2
Teşekkür ederim @Omar Fikir mükemmel. Ancak çok uzun sürüyor ve bazı durumlarda
donuyor

1
@WahidBitar ile anlaştı - Harika konsept - birim test verilerini ayarlamak için mükemmel, ancak uzantı oldukça bozuk görünüyor ve çöktüğünde Visual Studio'yu da yanına alıyor!
Dib

Bu gerçekten çok kullanışlı bir araçtır.
Ashutosh Singh


4

Bunu, Visual Studio'nun "Hemen" penceresinde, JSON'u c:\directory\file.jsonyazmak istediğiniz dosyanın tam yolunu ve myObjectserileştirilecek değişkeninizle değiştirerek kullanın:

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

3

Kullandığım bir uzatma yöntemim var:

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 için bir dizeyle aşırı yüklüyorum ve hemen pencereden çağırıyorum:

public static void ToSerializedObjectForDebugging(this object o, string saveTo)
{
    ToSerializedObjectForDebugging(o, new FileInfo(saveTo));
}

3

Hemen pencereyi serileştirmek için kullanmak ve ardından içeriği favori düzenleyicinize kopyalamak mümkün olabilir.

Diğer bir seçenek, ToString()yöntemi geçersiz kılmak ve hata ayıklama modunda çağırmaktır.

Ayrıca, içeriği çökmeden kısa bir süre önce bir dosyaya yazabilir veya kodu bir dene / yakala içine sarabilir ve ardından dosyayı yazabilirsiniz. Ne zaman çökeceğini belirleyebileceğinizi varsayıyorum.


Teşekkürler, İzleme penceresinden de aynısını denedim, ancak bana "İşlev değerlendirmesi tüm iş parçacıklarının çalışmasını gerektiriyor" dedi. Anında pencere çöz
xvorsx

1

Omar Elabd'ın cevabının bir varyasyonu:

Ücretsiz değil, ancak OzCode için ücretsiz bir deneme var
( https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode ).

Buradaki bağlam / vurgulu menü içinde JSON'a yerleşik dışa aktarma var ve Nesne Dışa Aktarma uzantısından biraz daha iyi çalışıyor (ücretsiz olmaması için takas).

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

Bunun olaydan birkaç yıl sonra olduğunu biliyorum, ama burada bir cevap bırakıyorum çünkü bu benim için işe yaradı ve başka biri faydalı bulabilir.


1

Dairesel bir referansınız varsa, bunu hemen Pencerede çalıştırın:

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

1

ObjectDumper.Net kullanıyorum .

Özellikle canlı birim testiniz varsa iyi çalışır. Bir test çalıştığında konsolda bir değişkenin değerini kolayca görüntüleyebiliyorum, bu da beni manuel olarak hata ayıklamaktan kurtarıyor.

Bu size XUnit kullanıyorsanız yardımcı olabilir.


0

Alexey'nin cevabının bir varyasyonu. Biraz daha karmaşıktır ancak bir metin dosyasına yazmayı gerektirmez:

1) Hemen Penceresine şunu girin:

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

2) Gözcü Penceresine iki saat girin:

a.  stringWriter

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

İkinci saati (Serialize olanı) girdikten sonra stringWriter saat değeri, XML'e serileştirilmiş obj olarak ayarlanacaktır. Kopyalayıp yapıştırın. XML'in süslü parantezler içine alınacağını, {...}, bu nedenle XML'i herhangi bir şey için kullanmak istiyorsanız bunları kaldırmanız gerekeceğini unutmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.