我有一个非常典型的'二进制流'#'不包含有效的BinaryHeader'问题,但经过大量搜索后看不到它的原因。我已将问题归结为绝对基础知识,但仍然出现错误。
这是我的班级我正在序列化:
[序列化] ref class 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结束,这与我见过的几个例子相符。我注意到的是,在流中,字段名称前面带有“&lt; backing_store&gt;”但是我找不到任何可以解释为什么那么糟糕的东西。我得出的结论是,DateTime或TimeSpan可以'是序列化的,但我找不到任何可以说是这样的情况,这不是正在产生的错误信息。如果有人能够对此有所了解,我将非常感激,因为我的头受到了所有的伤害撞。
由于 亚当
答案 0 :(得分:-1)
嗯,你让我失去了stackoverflowers,但我到了底部。问题是类中的DateTime ^对象。如果我使用DateTime而不是它有效,但它似乎是一个更合理的解决方案,实际转换为字符串,并避免任何潜在的本地时间问题。我在这里发布了http://www.electronic-designer.co.uk/programming/visual-cpp-cli-dot-net/serialization/serialization-of-a-class