Есть проект(ThreadTracking) в потором есть форма(ThreadTracking.cs) и файл(ThreadTrackingCommon.cs).
В файле ThreadTrackingCommon.cs опреденлен класс ThreadTrackingSettings.
Есть форма:
public partial class ThreadTracking : Form
{
private TrackersCollection m_TrackersList = new TrackersCollection();
private ThreadTrackingSettings m_ThreadTrackingSettings = new ThreadTrackingSettings();
...
public void SaveState( string FileNamePrefix )
{
FileStream sw = new FileStream( FileNamePrefix + GetType().Name + ".bin", FileMode.Create, FileAccess.Write );
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize( sw, m_TrackersList );
bf.Serialize( sw, m_ThreadTrackingSettings );
sw.Close();
}
...
public void LoadState( string FileNamePrefix )
{
FileStream fs = new FileStream( FileNamePrefix + GetType().Name + ".bin", FileMode.Open, FileAccess.Read );
BinaryFormatter bf = new BinaryFormatter();
m_TrackersList = bf.Deserialize( fs ) as TrackersCollection;
m_ThreadTrackingSettings = bf.Deserialize( fs ) as ThreadTrackingSettings;
fs.Close();
}
}
На строке с десереализацией класса ThreadTrackingSettings программа падает с ошибкой "Не удалось найти сборку "ThreadTracking, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null". Хотя все эти файлы лежат в одном проекте.Классы TrackersCollection и ThreadTrackingSettings помечены как Serializable.
Подскажите в чем проблема?
Заранее спасибо!
Проблема решилась следующим путем:
public class Binder : SerializationBinder
{
public override Type BindToType( string assemblyName, string typeName )
{
Type tyType = null;
string sShortAssemblyName = assemblyName.Split( ',' )[0];
System.Reflection.Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach( System.Reflection.Assembly ayAssembly in ayAssemblies )
{
if( sShortAssemblyName == ayAssembly.FullName.Split( ',' )[0] )
{
tyType = ayAssembly.GetType( typeName );
break;
}
}
return tyType;
}
}
При десериализации указываем:
BinaryFormatter bf = new BinaryFormatter();
bf.Binder = new Binder();
m_TrackersList = bf.Deserialize( fs ) as TrackersCollection;
m_ThreadTrackingSettings = bf.Deserialize( fs ) as ThreadTrackingSettings;