Мне нужно сериализовать массив объектов array<object^>^
в C ++ / CLI, который содержит один intPtr
и словарь Dictionary<IntPtr,ObjectInfo>
, где ObjectInfo
- некоторый пользовательский класс. Он сериализуется правильно, но при десериализации выдает эту ошибку:
"System.Runtime.Serialization..SerializationException:Unable
для загрузки типа
System.Collections.Generic.Dictionary'2 [[System.IntPtr, mscorlib,
Version = 4.0.0.0" ,
Культурные = нейтральная, PublicKeyToken = ..............], [System.Collection.Generic.List'1 [[SharedObjects.ObjectInfo, SharedObjects, версия ....]]
требует десериализации.
Я передаю array<object^>^
в Type->InvokeMember
в качестве аргументов, и эти аргументы необходимо десериализовать перед передачей в InvokeMember
.
Но он не работает во время десериализации.
Сериализация кода:
void Serialize(Object^ obj)
{
if (obj == nullptr)
{
_length = 0;
return;
}
// We could write directly to shared data through an UnmanagedMemoryStream, and
// catch an error if not big enough. But then we don' get info about how much memory
// we needed, so instead we write to a dynamically resizing MemoryStream first.
MemoryStream^ memstream = gcnew MemoryStream();
BinaryFormatter^ formatter = gcnew BinaryFormatter();
formatter->Serialize(memstream, obj);
_length = (int)memstream->Length;
if (_length > sizeof(_data))
{
throw gcnew ApplicationException(String::Format("Not enough shared memory to transfer data (have {0} bytes, but {1} bytes required)", sizeof(_data), _length));
}
UnmanagedMemoryStream^ stream = gcnew UnmanagedMemoryStream(_data, _length, _length, FileAccess::Write);
memstream->WriteTo(stream);
memstream->Close();
stream->Close();
}
Код десериализации
Object^ Deserialize()
{
if (_length == 0)
{
return nullptr;
}
UnmanagedMemoryStream^ stream = gcnew UnmanagedMemoryStream(_data, _length, _length, FileAccess::Read);
BinaryFormatter^ formatter = gcnew BinaryFormatter();
Object^ obj = formatter->Deserialize(stream);
stream->Close();
return obj;
}