diff --git a/Parallel/DIY/vtkDIYUtilities.cxx b/Parallel/DIY/vtkDIYUtilities.cxx
index c84a8a62bbbe5bfb39b924f87d3dd469fe43225b..952703964f5957e2647857483f7421fc7d22360e 100644
--- a/Parallel/DIY/vtkDIYUtilities.cxx
+++ b/Parallel/DIY/vtkDIYUtilities.cxx
@@ -45,40 +45,19 @@ struct SaveArrayWorker
   {
   }
 
-  template <class ArrayT>
-  void operator()(ArrayT* array)
+  template <typename ValueType>
+  void operator()(vtkAOSDataArrayTemplate<ValueType>* array)
   {
-    using ValueType = vtk::GetAPIType<ArrayT>;
-    ValueType* data(nullptr);
-    if (array->HasStandardMemoryLayout())
-    {
-      // get the void pointer, this is OK for standard memory layout
-      data = static_cast<ValueType*>(array->GetVoidPointer(0));
-    }
-    else
-    {
-      // create a temporary data array for saving.
-      data = new ValueType[array->GetNumberOfValues()];
-
-      const auto range = vtk::DataArrayTupleRange(array);
-      using ConstTupleRef = typename decltype(range)::ConstTupleReferenceType;
-      using ComponentType = typename decltype(range)::ComponentType;
-
-      vtkIdType i(0);
-      for (ConstTupleRef tpl : range)
-      {
-        for (ComponentType comp : tpl)
-        {
-          data[i++] = comp;
-        }
-      }
-      assert(i == array->GetNumberOfValues());
-    }
+    diy::save(this->BB, array->GetPointer(0), array->GetNumberOfValues());
+  }
 
-    diy::save(this->BB, data, array->GetNumberOfValues());
-    if (!array->HasStandardMemoryLayout())
+  template <typename ArrayT>
+  void operator()(ArrayT* array)
+  {
+    switch (array->GetDataType())
     {
-      delete[] data;
+      vtkTemplateMacro(vtkNew<vtkAOSDataArrayTemplate<VTK_TT>> aosArray; aosArray->DeepCopy(array);
+                       this->operator()(aosArray.Get()));
     }
   }