Link to home
Start Free TrialLog in
Avatar of engg
engg

asked on

serializing an object of the managed C++ wrapper class

Hello,
I am working on an ASP.NET web application in C# in which I had to use a native (pure) C++ class as it was.  So I created a managed C++ wrapper class for this class. I create an object of this wrapper class and serialize it and pass it over the network using sockets.  The problem is serialization of this object produces a runtime error.
This is my code.
--------------------------------
#pragma once                 //(listParam.h)      this is the unmanaged class  
class listParam        
{
    char name[31];
    public:
     listParam(void){};
     int getSize(){return 0};
};
------------------------------

#pragma once               //(managed_cpp.h)     this is the wrapper class.
using namespace System;
#include "..\native_cpp\listparam.h"
namespace managed_cpp
{
     public __gc class MlistParam
     {
            public:
               MlistParam()     { m_pC = new listParam(); }
               int MgetSize() { return m_pC->getSize(); }
            private:
               listParam * m_pC;                                              //I think C# can't serialize it because of this member.
     };
}
----------------------------------------------------------
//serialization code
managed_cpp.MlistParam packet = new managed_cpp.MlistParam();
System.IO.MemoryStream ms = new System.IO.MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, packet);                                                     //This line produces the following runtime error.
------------------------------------------------------------

Exception Details: System.Runtime.Serialization.SerializationException: The type System.Reflection.Pointer in Assembly mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 is not marked as serializable.

Please help. Thank you.

Avatar of andrewjmears
andrewjmears

This article looks like it might point you in the right direction?
http://www.codeproject.com/dotnet/Surrogate_Serialization.asp
If you don't need to serialize m_pC member, mark is with NonSerialized attribute.
If you need to serialize it by some custom way, derive MlistParam from ISerializable and implement your own serialization logic in ISerializable functions.
Avatar of engg

ASKER

Thanks.

I need to serialize the object of the listParam (native C++ class) because ultimately I need to send that object over the network. How do I do that?
Do I need to serialize the object of its managed C++ wrapper class which contains just a pointer (m_pC ) to its native C++ object? Do I need to serialize the pointer? because that pointer is causing the problem.
Please help.
You need to convert this pointer to some well-known type, like String^. Pointer itself cannot be serialized, because after deserialization it points to arbitrary memory location. Read about serialization here:
http://www.codeproject.com/csharp/objserial.asp

This is C#, but any C++ developer understands C#. Read "Define Serialization functions" paragraph. When object is serialized (GetObjectData), extract name from m_pC, convert is to String^ and write to SerializationInfo. When object is deserialized (constructor with SerializationInfo parameter), read String^ from SerializationInfo, create new listParam instance,  convert String^ to char* and fill name field.
Avatar of engg

ASKER

Thanks Alex. I am going to read it now.

The native C++ class listParam contains 4 private members and a few functions, which I didn't mention before.
Sorry about that. I just want to make sure if that changes the way its serialization should be implemented.

class listParam
{
    char name[31];
    bool include;
    short size;
    char dummy[64*1024];

    public:
    listParam(void);
    ~listParam(void);
    bool isInclude();
    int getSize();
    void addString(const char *str);
    const char *getString(char **p);
}
      

Convert all these members to something that .NET knows: String^, array<Byte>^ etc. and implement serialization/deserialization code.
Avatar of engg

ASKER

Thanks. When I send it over the network, on the other side, there is going to be just the native C++ class (listParam) code. There is no C# once the object is sent, so it will be deserialized using C++. My job is just to send it from my side.
Avatar of engg

ASKER

so should I convert all these members of the C++ class to their .NET equivalent in the wrapper? How will C++ deserialize the native C++ class object then?
ASKER CERTIFIED SOLUTION
Avatar of AlexFM
AlexFM

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of engg

ASKER

Thanks Alex. I will try this out.  I have been given something else to work on right now.  Thanks for your quick responses.
I will get back to you soon.
Avatar of engg

ASKER

I am looking into messagequeue class in .NET.