Десериализовать Revit API
Это мой первый раз, когда я начинаю понимать сериализацию... на самом деле я занимаюсь разработкой Autodesk Revit через C#.
Задача:
Мне нужно записать данные в новый файл на жестком диске, чтобы этот файл можно было открыть с другого компьютера через Revit.
Процедура:
- Обработка всех необходимых данных. Главный класс.
- Создайте и передайте эти данные в сериализуемый класс.
- Сохранить в файл данных из основного класса.
- Удалите поток и установите сериализуемый класс в нуль.
- Deserialize.
- Делать вещи на ревит на основе полученных данных.
Проблема- программа работает без ошибок и все в порядке. - нажмите кнопку еще раз, чтобы перезапустить программу, которая не удалась при десериализации с этим кодом ошибки
[A]Cons_Coor.ThrDviewData нельзя преобразовать в [B]Cons_Coor.ThrDviewData. Тип A происходит от 'Cons_Coor, версия =1.0.0.0, культура = нейтральная, PublicKeyToken=null' в контексте 'LoadNeither' в местоположении 'C:\Users\mostafa\AppData\Local\Temp\RevitAddins\Cons_Coor-Executing-20140820_224454_4113\Cons_Coor.dll. Тип B происходит от 'Cons_Coor, версия =1.0.0.0, культура = нейтральная, PublicKeyToken=null' в контексте 'LoadNeither' в местоположении 'C:\Users\mostafa\AppData\Local\Temp\RevitAddins\Cons_Coor-Executing-20140820_230011_0316\Cons_Coor.dll'. Первое случайное исключение типа System.NullReferenceException произошло в Cons_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 Data\r\n");
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);
}
}
так какие-нибудь намеки?
1 ответ
Используемый вами двоичный сериализатор очень тесно связан с классом, который вы экспортируете. Когда вы используете менеджер надстроек Revit для загрузки своего надстройки, он создает динамическую копию вашей сборки (чтобы вы могли вернуться и загрузить ее снова, находясь в том же сеансе). Когда это происходит, вы получаете дубликаты типов с одинаковыми именами (ThrDviewData). Когда вы пытаетесь загрузить ранее сериализованный двоичный файл, который был из другой копии, он все еще пытается сопоставить исходный тип (не новую копию типа).
Ваш выбор: 1. Не используйте менеджер надстроек, просто статически используйте надстройку. 2. Используйте что-то кроме двоичного сериализатора, который не так тесно связан с типами (например, сериализатор XML или JSON - как вы пытались).
Вот что случилось...