Двоичный поток '128' не содержит допустимого BinaryHeader - PullRequest
1 голос
/ 07 сентября 2011

У меня есть один из этих очень типичных «двоичных потоков» #, который не содержит действительных проблем 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 не могут быть сериализованным, но я не могу найти ничего, чтобы сказать, что это так, и это не сообщение об ошибке. Если кто-то может пролить свет на это, я был бы очень благодарен, так как моя голова болит от всех ударов .

Спасибо Адам

1 Ответ

0 голосов
/ 13 сентября 2011

Ну, вы меня подвели, и я дошёл до сути. Проблема заключается в объектах DateTime ^ в классе. Если я вместо этого использую DateTime, то это работает, но кажется, что это более разумное решение, чтобы фактически преобразовать в строку и избежать любых потенциальных проблем с местным временем. Я написал об этом здесь http://www.electronic -designer.co.uk / программирование / visual-cpp-cli-dot-net / сериализация / сериализация класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...