У меня есть один из этих очень типичных «двоичных потоков» #, который не содержит действительных проблем BinaryHeader, но после долгих поисков не может найти причину этого. Я переместил проблему до абсолютных основ, и все же я получаю сообщение об ошибке.
Это мой класс, который я сериализую:
[Serializable]
Класс ref ExportRequestData
{
общественности:
property int ThisRecordingId;
property DateTime ^ThisRecordingStartTime;
property array<DateTime> ^FromTimes;
property array<TimeSpan> ^Durations;
property String ^CameraAFilename;
property String ^CameraBFilename;
property String ^CameraCFilename;
property String ^CameraDFilename;
property String ^SubtitleTags;
property String ^SaveAsFilename;
ExportRequestData(int ThisRecordingId, DateTime ^ThisRecordingStartTime, array<DateTime> ^FromTimes, array<TimeSpan> ^Durations,
String ^CameraAFilename, String ^CameraBFilename, String ^CameraCFilename, String ^CameraDFilename,
String ^SubtitleTags, String ^SaveAsFilename);
};
И это мой код, сокращенный для выполнения абсолютного базового теста:
try
{
ExportRequestData ^ExportRequestData1 = gcnew ExportRequestData(ThisRecordingId, ThisRecordingStartTime, FromTimes, Durations,
CameraAFilename, CameraBFilename, CameraCFilename, CameraDFilename,
SubtitleTags, SaveAsFilename);
MemoryStream ^MemoryStream1 = gcnew MemoryStream();
BinaryFormatter ^BinaryFormatter1 = gcnew BinaryFormatter();
BinaryFormatter1->Serialize(MemoryStream1, ExportRequestData1);
MemoryStream1->Flush();
MemoryStream1->Position = 0;
MemoryStream1->Seek(0, SeekOrigin::Begin);
ExportRequestData ^ExportRequestData2;
ExportRequestData2 = (ExportRequestData^)BinaryFormatter1->Deserialize(MemoryStream1); //<<<< THIS CAUSES ERROR
MemoryStream1->Close();
}
catch (Exception ^e)
{
MessageBox::Show(e->ToString(), L"Error", MessageBoxButtons::OK, MessageBoxIcon::Error);
}
Это ошибка:
«Двоичный поток '128' не содержит допустимого BinaryHeader. Возможные причины: неверный поток или изменение версии объекта между сериализацией и десериализацией."
Таким образом, я десериализирую тот же поток памяти, который я только что сериализовал, после поиска назад к его началу, таким образом удаляя любую вероятность повреждения потока перед десериализацией. Содержимое MemoryStream1 выглядит хорошо (начинается с 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF ... и заканчивается ... 0x00, 0x00, 0x00, 0x00, 0x0B, что соответствует нескольким примерам, которые я видел. Удивительно, но я заметил, что в потоке именам полей предшествует «», но я не могу найти ничего, чтобы сказать, почему это плохо. Я пришел к выводу, что, возможно, DateTime или TimeSpan не могут быть сериализованным, но я не могу найти ничего, чтобы сказать, что это так, и это не сообщение об ошибке. Если кто-то может пролить свет на это, я был бы очень благодарен, так как моя голова болит от всех ударов .
Спасибо
Адам