Marshaling/Unmarshaling vtkDataObjects does not work
Methods vtkCommunicator::MarshalDataObject
and vtkCommunicator::UnMarshalDataObject
are not correct, ie marshaling then unmarshaling an object does not give back a correct object. Bug was discovered when trying to use vtkCommunicator::Gather(vtkDataObject* sendBuffer, std::vector<vtkSmartPointer<vtkDataObject>>& recvBuffer, int destProcessId)
in ParaView.
See below for a minimal example :
int main(int, char*[])
{
constexpr int SIZE = 101;
vtkNew<vtkDoubleArray> array1;
array1->SetName("Array_1");
array1->SetNumberOfValues(SIZE);
vtkNew<vtkIdTypeArray> array2;
array1->SetName("Array_2");
array2->SetNumberOfValues(SIZE);
for (vtkIdType i = 0; i < SIZE; ++i)
{
array1->SetValue(i, 0.5 * static_cast<double>(i));
array2->SetValue(i, i);
}
// vtkNew<vtkStringArray> field;
// field->SetName("Tata");
// field->SetNumberOfValues(1);
// field->SetValue(0, "Toto");
vtkNew<vtkTable> table;
table->AddColumn(array1);
table->AddColumn(array2);
// table->GetFieldData()->AddArray(field);
vtkNew<vtkCharArray> buffer;
if (vtkCommunicator::MarshalDataObject(table, buffer) == 0)
{
std::cerr << "Couldn't marshal object" << std::endl;
return 1;
}
auto newTable = vtkTable::SafeDownCast(vtkCommunicator::UnMarshalDataObject(buffer));
if (newTable == nullptr)
{
std::cerr << "Couldn't unmarshal object" << std::endl;
return 1;
}
auto* newArray1 = vtkDoubleArray::SafeDownCast(newTable->GetColumnByName("Array_1"));
auto* newArray2 = vtkIdTypeArray::SafeDownCast(newTable->GetColumn(1));
// assert(strcmp(vtkStringArray::SafeDownCast(newTable->GetFieldData()->GetArray("Tata"))->GetValue(0).c_str(), "Toto") == 0 && "Field data is invalid");
assert(newArray1->GetNumberOfValues() == SIZE && "Unmarshaled array is illformed");
assert(newArray2->GetNumberOfValues() == SIZE && "Unmarshaled array is illformed");
assert(strcmp(newArray2->GetName(), "Array2") && "Array2 name is invalid");
for (vtkIdType i = 0; i < SIZE; ++i)
{
assert(newArray1->GetValue(i) == array1->GetValue(i) && "Array1 value is invalid");
assert(newArray2->GetValue(i) == array2->GetValue(i) && "Array2 value is invalid");
}
return 0;
}
Edited by Timothee Chabat