Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.

Deserialize Byte Array

James_B_5
Beginner
748 Views

Hi,

I have a byte array in Fortran that has been serialised in vb. I was wondering if it's possible to deserialize it in Fortran using a custom TYPE or something?

In VB the object format is:

       Public Class CustomClass
           Property1 as Double
           Property2 as Double
           Property3 as Double
       End Class

and I serialize it with: 

        Public Shared Function ObjectToByteArray(inputObject As Object) As Byte()
            Dim binaryFormatter As New BinaryFormatter()
            ' Create new BinaryFormatter
            Dim memoryStream As New MemoryStream()
            ' Create target memory stream
            binaryFormatter.Serialize(memoryStream, inputObject)
            ' Serialize object to stream
            Return memoryStream.ToArray()
            ' Return stream as byte array
        End Function

I then write it to a Memory Map File and read it into Fortran:

byte, pointer, dimension(:)    ::  BYT
...
call c_f_pointer(cdata, BYT, [4096])

Which all works fine, but now I'm stuck on how to deserialise this byte array. The Fortran structure might be something like:

      TYPE CUSTOM_CLASS
        REAL(8) :: PROPERTY1
        REAL(8) :: PROPERTY2
        REAL(8) :: PROPERTY3
      END TYPE CUSTOM_CLASS

But I'm passed the limit of my Fortran knowledge! Any help would be appreciated.

Thanks,

0 Kudos
1 Reply
FortranFan
Honored Contributor III
748 Views

You appear to be using VB in Microsoft .NET, so have you looked into ISO_C_BINDING and BIND(C) in standard Fortran (starting with Fortran 2003) and C interoperability.  This is because with .NET, the P/Invoke layer used by Microsoft .NET for marshaling between managed .NET side and unmanaged Fortran side is C-like and the companion processor that comes into play can be seen as being compatible with standard Fortran interoperation with C.  So with this, a derived type such as

   type, bind(c) :: CustomClass
      real(c_double) :: Property1
      real(c_double) :: Property2
      real(c_double) :: Property3
   end type CustomClass

can interoperate with a struct in VB:

Public Structure CustomClass
   Public Property1 As Double
   Public Property2 As Double
   Public Property3 As Double
End Structure
    

So is it possible you can directly use something along these lines instead of serializing and deserializing?

0 Kudos
Reply