簡體   English   中英

如何在VS2010中創建自定義的Debugger Visualizer,以可視化不可序列化的類?

[英]How to create a custom Debugger Visualizer in VS2010 to visualize a class which is non-Serializable?

我想用VS2010中的自定義Debugger Visualizer可視化對象。 但是該類的對象沒有Seri​​alizable屬性。 由於源代碼已編寫和維護很長時間,因此我不想僅出於Debugger Visualizer的目的將類更改為Serializable。

有人可以告訴我如何實現這一目標嗎?

我在這里附上使用Newtonsoft的Json.net實現問題的代碼。

namespace MyCustomVisualizer
{
    public class MyObjectSource : VisualizerObjectSource
    {
        public override void GetData(object target, Stream outgoingData)
        {
            try
            {
                byte[] byteArray = JsonHelper.Serialize(target);
                outgoingData.Write(byteArray, 0, byteArray.Length);
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.Message, "VisualizerObjectSource Error");
            }
        }
    }

    public class MyVisualizer : DialogDebuggerVisualizer
    {
        override protected void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
            try
            {
                string _str = null;
                Stream _stream = objectProvider.GetData();

                if (_stream != null && _stream.Length > 0)
                {
                    object _obj = null;
                    _obj = JsonHelper.Deserialize(_stream); // Here i get the object i want
                    // ^^^
                    // Now add ur code to visualize the object in your way.

                    /* This is only to verify the object data before visualizing.
                    if (_obj != null)
                    {
                        _str = JsonHelper.ObjectToString(_obj);
                        MessageBox.Show(_str, "Show");
                    }
                    */
                }

                // Show the grid with the list
                windowService.ShowDialog();
            }
            catch (Exception exp) { MessageBox.Show(exp.Message, "Visualizer Error"); }
            finally
            {
            }
        }
    }

    #region JsonHelper Class
    public static class JsonHelper
    {
        public static byte[] Serialize(object _Object)
        {
            MemoryStream _MemoryStream = new MemoryStream();
            JsonSerializer serializer = new JsonSerializer();
            serializer.NullValueHandling = NullValueHandling.Ignore;
            serializer.TypeNameHandling = TypeNameHandling.Auto;

            try
            {
                using (StreamWriter sw = new StreamWriter(_MemoryStream))
                using (JsonWriter writer = new JsonTextWriter(sw))
                {
                    serializer.Serialize(writer, _Object);
                }
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.Message, "Serialize Error");
            }
            return _MemoryStream.ToArray();
        }

        public static object Deserialize(Stream _ByteArray)
        {
            Object _object = new Object();
            JsonSerializer serializer = new JsonSerializer();
            serializer.NullValueHandling = NullValueHandling.Ignore;
            serializer.TypeNameHandling = TypeNameHandling.Auto;
            try
            {
                StreamReader sw = new StreamReader(_ByteArray);
                JsonReader reader = new JsonTextReader(sw);
                _object = serializer.Deserialize(reader);
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.Message, "Deserialize Error");
            }
            return _object;
        }

        public static string ObjectToString(object _object)
        {
            string _str = string.Empty;
            JsonSerializerSettings _jsonSerializeSettings = new JsonSerializerSettings();
            _jsonSerializeSettings.NullValueHandling = NullValueHandling.Ignore;
            _jsonSerializeSettings.TypeNameHandling = TypeNameHandling.Auto;
            _str = JsonConvert.SerializeObject(_object, Newtonsoft.Json.Formatting.Indented, _jsonSerializeSettings);
            return _str;
        }
    }
    #endregion

}

由於BinaryFormatter希望將該類標記為可序列化,因此無法對其進行處理。 但是,您可以使用其他序列化器,例如:

我遇到了同樣的問題,因為我不想更改整個對象模型,所以我寫了一個幫助程序庫SInject ,它將給定程序集上的序列化屬性注入抽象類型,接口和非公共類型以外的所有類型。 如果您想使用BinaryFormatter,請嘗試該庫,可以在構建后使用MSBuild任務來完成。

如果您對這里感興趣那么有一個有關如何編寫MSBuild任務的MSDN指南。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM