Я хочу сериализовать массив структур с бинарным форматированием, чтобы отправить его по сети или сохранить в файл в этом случае.
Он подписан на событие Form.Closing моей формы
void writeHistoryToFile(object sender, CancelEventArgs e)
{
ListView.ListViewItemCollection coll = historyListView.Items;
int count = coll.Count;
if(count == 0)
return;
BinaryFormatter bf = new BinaryFormatter();
MemoryStream memStr = new MemoryStream();
searchResult[] container = new MainForm.searchResult[count];
for(int i = 0; i < count; i++)
{
searchResult tagged = (searchResult)coll[i].Tag;
container[i] = tagged;
}
byte[] bytesToWrite;
bf.Serialize(memStr, container); //HERE
bytesToWrite = memStr.ToArray(); //BREAKPOINT
List<FileInfo> hisFls = historyFiles;
if(hisFls.Count != 0)
{
foreach(FileInfo element in hisFls)
{
element.Delete();
}
}
FileInfo serFile = getTempFile(".avsh");
using(FileStream writeStream = serFile.OpenWrite())
{
writeStream.Write(bytesToWrite, 0, bytesToWrite.Length);
writeStream.Flush();
}
}
Что оно делает:
Я закрываю форму, и функция вызывается (точки останова, установленные выше ЗДЕСЬ, запускаются).
Когда вы бежите свободно, форма не закрывается и снова реагирует.
Когда вы переходите через код, отладчик вскоре висит в ЗДЕСЬ, а затем код снова запускается снова.
Точки останова, расположенные за ЗДЕСЬ, никогда не достигаются.
Таким образом, кажется, что двоичный форматировщик возвращает функцию или что-то, но без какого-либо исключения или такого.
UPATE
Похоже, что моя структура не сериализуема, так.
Добавлено [Serializable]
и теперь он работает. См. Комментарии относительно того, почему не было исключений и т.д. -_- Errormessage и stacktrace
The Type "ExportGrepper.MainForm+searchResult" in Assembly Arbeitsvorräte duchsuchen, Version=1.0.5351.15603, Culture=neutral, PublicKeyToken=null" is not marked as serializable.
at System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)
at System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)
at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter)
at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter)
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteArray(WriteObjectInfo objectInfo, NameInfo memberNameInfo, WriteObjectInfo memberObjectInfo)
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph)
at ExportGrepper.MainForm.writeHistoryToFile(Object sender, CancelEventArgs e)
"Ответ", чтобы закрыть этот вопрос: попробуйте добавить Try..Catch к вашему коду и проверить, какая ошибка. Затем сделайте вашу структуру сериализуемой. ;)