这是我第一次接触序列化…事实上,我正在用c#开发Autodesk Revit。
目的:
我需要将数据记录到HDD上的新文件中,以便通过Revit从另一台计算机打开该文件。
程序:
- 从Main类处理所有需要的数据。
- 实例化这些数据并将其传递给Serializable类。
- 保存主类的数据文件
- 处理流并设置可序列化类为空。
- 反序列化。
- 根据获取的数据在revit上进行操作。
-程序工作完美,没有错误,一切都很好。-再次按下按钮重新运行程序,反序列化失败,错误码
Cons_Coor。ThrDviewData不能强制转换为[B] con_coor .ThrDviewData。类型A源自于位置"C:UsersmostafaAppDataLocalTempRevitAddins con_coor - executor -20140820_224454_4113 con_coor .dll"的上下文"LoadNeither"中的"con_coor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"。类型B来自于位置"C:UsersmostafaAppDataLocalTempRevitAddins con_coor - executing -20140820_230011_0316 con_coor .dll"的上下文"LoadNeither"中的"con_coor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"。类型为"System"的第一次机会异常。NullReferenceException'在con_coor .dll中发生
主类:
///main class
.....
.....
ThrDviewData v3ddata = new ThrDviewData(); ///instantiate a serializable class
///collect all required data
string filename = UT_helper.conpaths(UT_constants.paths.Desktop) + "\comment2" + DateTime.Today.ToShortTimeString().Replace(":", "") + ".a4h";
using (Stream stream = File.Open(filename, FileMode.Create))
{
BinaryFormatter bformatter = new BinaryFormatter();
Debug.WriteLine("Writting Datarn");
bformatter.Serialize(stream, v3ddata);
stream.Close();
}
v3ddata = null;
using (Stream stream = File.Open(filename, FileMode.Open))
{
BinaryFormatter bformatter = new BinaryFormatter();
Debug.WriteLine("Reading data from file");
try
{
v3ddata = (ThrDviewData)bformatter.Deserialize(stream);
}
catch (Exception ex)
{
Debug.Write(ex.Message);
// File.Delete(filename);
}
stream.Close();
}
....
....
///do some stuff with the acquired data
可序列化类 public string myvariables;
public ThrDviewData()
{
myvariables = null;
}
public ThrDviewData(SerializationInfo info, StreamingContext ctxt)
{
myvariables= (String)info.GetValue("name", typeof(string));
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("name", myvariables);
}
// Public implementation of Dispose pattern callable by consumers.
public void Dispose()
{
GC.SuppressFinalize(this);
}
}
有什么提示吗?
您正在使用的Binary Serializer与您要导出的类紧密相连。当您使用Revit Addin管理器加载插件时,它会动态复制您的程序集(以便您可以在同一会话中返回并再次加载它)。当它这样做时,您将得到具有相同名称的重复类型(ThrDviewData)。当您尝试加载来自不同副本的先前序列化的二进制文件时,它仍在尝试映射到原始类型(而不是该类型的新副本)。
你的选择是:1. 不要使用插件管理器,只是静态地使用插件。2. 使用与类型没有那么紧密耦合的二进制序列化器以外的其他东西(如XML或JSON序列化器-如您所尝试的)。