可以序列化一个不可序列化的对象?

时间:2013-02-22 15:48:54

标签: vb.net serialization

出于测试目的,我想查看HttpApplication对象的所有属性及其对应值(我正在测试HTTPModule的一些功能)。我的第一个想法是将其序列化为XML,然后查看或将其写入文件。

问题是,HttpApplication不是可序列化的类,因此当我尝试序列化时会抛出异常。是否有其他技术,或者甚至可以获得非序列化对象的字符串表示?我只想看到我使用Intellisense获得的所有相同属性及其值。

我看过一些提到反思的文章,但我没有找到任何暗示它适合我的情景的文章。

更新

在得到一些回复之后,看起来我需要使用Reflection。这是我正在使用的代码:

Dim sProps As New StringBuilder
For Each p As System.Reflection.PropertyInfo In oHttpApp.GetType().GetProperties()
  If p.CanRead Then
    sProps.AppendLine(p.Name & ": " & p.GetValue(oHttpApp, Nothing))
  End If
Next

在我的AppendLine语句中,立即抛出异常:

  

System.InvalidCastException:Operator'&'没有为字符串定义   “上下文:”并输入“HttpContext”。在   Microsoft.VisualBasic.CompilerServices.Operators.InvokeObjectUserDefinedOperator(UserDefinedOperator   Op,Object [] Arguments)at   Microsoft.VisualBasic.CompilerServices.Operators.InvokeUserDefinedOperator(UserDefinedOperator   Op,Object [] Arguments)at   Microsoft.VisualBasic.CompilerServices.Operators.ConcatenateObject(对象   左,对象右)

@granadaCoder,你提到我需要知道“深入”的方式,我想知道这是不是问题。在上面的错误中,Context是一个复杂的对象,所以我需要深入研究并得到它的各个属性,对吗?你知道我怎么能这样做 - 或者它就像在我的循环中GetProperties再次呼叫p一样简单吗?

2 个答案:

答案 0 :(得分:2)

听起来像反射的一个很好的用例 -

How to iterate through each property of a custom vb.net object?

您可以迭代所有对象的属性并创建自己的XML / JSON视图。

更新 -

以下是我如何将任何对象转换为字典的c#代码(适用于您的用例)

    public static Dictionary<string,string> ToDictionary<T>(this T me, string prefix=null) where T:class
    {
        Dictionary<string, string> res = new Dictionary<string, string>();

        if (me == null) return res;


        var bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.GetField;
        var properties = me.GetType().GetProperties(bindingFlags)
            .Where(i => i.CanRead
            );

        foreach (var i in properties)
        {
            var val = i.GetValue(me, null);
            var str = "";
            if (val != null)
                str = val.ToString();
            res[string.Format("{0}{1}", prefix, i.Name)] = str;
        }
        return res;
    }

答案 1 :(得分:1)

某些对象不是可序列化的。以IDataReader为例。

你必须要反思。并“剔除”可读的属性。

这是一些入门代码。

  private void ReadSomeProperties( SomeNonSerializableObject myObject ) 
  {

     foreach( PropertyInfo pi in myObject.GetType( ).GetProperties( BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty) ) 
     {
     //pi.Name
     //pi.GetValue( myObject, null )
     //don't forget , some properties may only have "setters", look at PropertyInfo.CanRead
     }

  }

当然,当属性是一个复杂的对象(不是标量)时,你必须弄清楚你想要挖掘的“深度”。