反序列化与序列化时不同的对象

时间:2011-03-29 15:57:27

标签: c# asp.net

我有一个反序列化对象的问题。我收到错误'System.Int32'无法转换为'System.Decimal'类型。此对象有许多子对象,并且由于此对象已被序列化,因此该对象的新版本具有一个或多个已从int更改为十进制的字段,现在我无法反序列化该对象,因为它与我的原始对象不匹配对象

我尝试过使用OnDeserializing方法但是context参数根本没有帮助我。

有解决方法吗?我在网上找到了一些例子,但它并不适用于我的情况。我想知道是否有办法查看我的序列化对象,即使我的对象现在已经改变,或者是否有办法找出哪个变量需要更改为十进制以及如何去做。

谢谢

嗨Joel,
我添加了你的代码,但我不太确定如何从我的代码中调用它。这就是我所拥有的:

public static Application LoadSnapshot(int appID, int statusID)
{  
  ApplicationSnapshotCollection AppSnap = new ApplicationSnapshotCollection();
  AppSnap.LoadByAppAndSnapshotStatusID(appID, statusID);
  Application app = null;

  try
  {
    if (AppSnap.Count > 0)
    {
      if (AppSnap[0].Snapshot != null)
      {
        BinaryFormatter bf = new BinaryFormatter();
        MemoryStream ms = new MemoryStream((byte[])AppSnap[0].Snapshot);
        ms.Position = 0;
        app = (Application)bf.Deserialize(ms);

        ms.Close();

        return app;
      }
      return null;
    }

    return null;

  }
  catch (Exception ex)
  {
    Dfait.Diagnostics.LogWriter.CriticalError(ex);
    return null;
  }

}

[OnDeserializing]
void OnDeserializing(StreamingContext context)
{
  //What do I put here?


}

protected Application(SerializationInfo info, StreamingContext context) 
{
  SerializationInfoEnumerator e = info.GetEnumerator();     
  Console.WriteLine("Values in the SerializationInfo:");     
  while (e.MoveNext())     
  {
    Console.WriteLine("Name={0}, ObjectType={1}, Value={2}", e.Name, e.ObjectType,   e.Value);     
  } 
}  
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) 
{  

} 

如何在我的场景中使用适当的参数调用构造函数?

1 个答案:

答案 0 :(得分:1)

你说你已经尝试过使用OnDeserializing方法,听起来你可以访问StreamingContext,所以听起来你正在Vistual Studio调试器中踩过,你可以访问源代码。您可以在类上实现ISerializable接口,这将使您可以更好地控制反序列化过程。实现ISerializable接口有两个部分,第一部分是添加一个以SerializationInfoStreamingContext为参数的构造函数。从那里,您可以通过调用GetEnumerator实例上的SerializationInfo方法来遍历类的序列化属性。

实施ISerializable的第二部分是定义方法void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)。在您的情况下,除了定义它之外,您不需要做任何事情来防止编译器抱怨。

编辑:我在我的代码示例中添加了类声明,以显示添加ISerializable接口。

public class Application : ApplicationBase, ISerializable
{
    protected Application(SerializationInfo info, StreamingContext context)
    {
        SerializationInfoEnumerator e = info.GetEnumerator();
        Console.WriteLine("Values in the SerializationInfo:");
        while (e.MoveNext())
        {
            Console.WriteLine("Name={0}, ObjectType={1}, Value={2}", e.Name, e.ObjectType, e.Value);
        }
    }

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {

    }
}