我有一个反序列化对象的问题。我收到错误'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)
{
}
如何在我的场景中使用适当的参数调用构造函数?
答案 0 :(得分:1)
你说你已经尝试过使用OnDeserializing方法,听起来你可以访问StreamingContext,所以听起来你正在Vistual Studio调试器中踩过,你可以访问源代码。您可以在类上实现ISerializable
接口,这将使您可以更好地控制反序列化过程。实现ISerializable
接口有两个部分,第一部分是添加一个以SerializationInfo
和StreamingContext
为参数的构造函数。从那里,您可以通过调用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)
{
}
}