Я хочу сериализовать/десериализовать объект, который был инстанцирован другим объектом, загруженным из сборки:
Interfaces.cs (из ссылающейся сборки, Interfaces.dll)
public interface ISomeInterface
{
ISettings Settings { get; set; }
}
public interface ISettings : ISerializable
{
DateTime StartDate { get; }
}
SomeClass.cs (из ссылающейся сборки, SomeClass.dll)
public class SomeClass : ISomeInterface
{
private MySettings settings = new Settings();
public ISettings Settings
{
get { return (ISettings)settings; }
set { settings = value as MySettings; }
}
}
[Serializable]
public class MySettings : ISettings
{
private DateTime dt;
public MySettings() { dt = DateTime.Now; }
protected MySettings(SerializationInfo info, StreamingContext context)
{
dt = info.GetDateTime("dt");
}
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("dt", dt);
}
public DateTime StartDate
{
get { return startFrom; }
internal set { startFrom = value; }
}
}
Проект запуска:
[Serializable]
public class ProgramState
}
public ISettings Settings { get; set; }
}
В проекте запуска, в конечном итоге, я устанавливаю Settings экземпляра ProgramState в Settings SomeClass. Затем я выполняю сериализацию с помощью:
public void SerializeState(string filename, ProgramState ps)
{
Stream s = File.Open(filename, FileMode.Create);
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(s, ps);
s.Close();
}
Это не вызывает никаких исключений. Я десериализую с помощью:
public ProgramState DeserializeState(string filename)
{
if (File.Exists(filename))
{
ProgramState res = new ProgramState();
Stream s = File.Open(filename, FileMode.Open);
BinaryFormatter bFormatter = new BinaryFormatter();
try
{
res = (ProgramState)bFormatter.Deserialize(s);
}
catch (SerializationException se)
{
Debug.WriteLine(se.Message);
}
s.Close();
return res;
}
else return new ProgramState();
}
Это вызывает исключение, и в выводе Debug появляется следующее:
В mscorlib.dll произошло исключение первого шанса типа 'System.Runtime.Serialization.SerializationException'
.
Unable to find assembly 'SomeClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
Я уверен, что сборка, содержащая SomeClass, была загружена до вызова DeserializeState, так почему же она выбрасывает исключение, что не может ее найти?
Я просмотрел некоторые учебники, но те, которые мне удалось найти, касаются только классов из одной сборки (к тому же, мое понимание процесса сериализации и десериализации в .NET минимально - ссылка на подробное объяснение могла бы быть полезной).
Тем временем, есть ли способ заставить это правильно десериализовать объект MySettings?