2016-03-30 3 views
0

Ich verwende C# .NET Compact Framework 2.0, für bestimmte Bedingungen versuche ich, mein Strukturobjekt zu serialisieren.Das Marshalling-Objekt gibt einen anderen Wert zurück

Da .NET 2.0 CF nicht über diese Funktion verfügt, bin ich Marshalling-Objekt.

ich kann in der Lage, es zu tun, aber das Problem ist, nach Unmarshalling des Objekts,

Ich erhalte unterschiedlichen Objektwert.

public struct Student 
{ 
public ushort Marks; 
public uint Age; 
} 

//// In Methode:

Codeblöcke wurden weiter unten

Student s; 
    s.Marks = 78; 
    s.Age = 20; 

// Marshaling object 's', its success. 
    char[] ar = SerializeObject(s); 

// Unmarshaling object back , its giving different value. For detail, pls. find the attached image. 

    Student s2 = DeserializeObject(ar, s); 





private char[] SerializeObject(Student objMS) 
      { 
       string objStr = string.Empty; 
       char[] objArr = new char[2048]; 
       int size = Marshal.SizeOf(objMS); 
       byte[] byteData = new byte[size]; 
       IntPtr ptr = Marshal.AllocHGlobal(size); 
       Marshal.StructureToPtr(objMS, ptr, false); 
       Marshal.Copy(ptr, byteData, 0, size); 
       Marshal.FreeHGlobal(ptr); 
       objStr = Convert.ToBase64String(byteData); 
       objArr = objStr.ToCharArray(); 
       return objArr; 
      } 

    private Student DeserializeObject(char[] objArr, Student metaStr) 
      { 
       Student objMS; 
       int size = Marshal.SizeOf(metaStr); 
       IntPtr ptr = Marshal.AllocHGlobal(size); 
       Marshal.Copy(objArr, 0, ptr, size); 
       objMS = (Student)Marshal.PtrToStructure(ptr, metaStr.GetType()); 
       Marshal.FreeHGlobal(ptr); 
       return objMS; 
      } 

Es wird großartig sein kann, wenn jemand die falsche vorschlagen, was ich hier tue .

Antwort

0

Das Problem ist der Convert.ToBase64String. Siehe Arbeitsbeispiel unten. Es ist auch wichtig zu beachten, dass das char [], das von einem COM-Objekt kommt, eine andere Kodierung (UTF8) haben wird, die beim Deserialisieren in .NET berücksichtigt werden muss.

 private static char[] SerializeObject(Student objMS) 
     { 
      string objStr = string.Empty; 
      int size = Marshal.SizeOf(objMS); 
      byte[] byteData = new byte[size]; 
      IntPtr ptr = Marshal.AllocHGlobal(size); 
      Marshal.StructureToPtr(objMS, ptr, true); 
      Marshal.Copy(ptr, byteData, 0, size); 
      Marshal.FreeHGlobal(ptr); 
      return BitConverter.ToString(byteData).ToCharArray(); 
     } 

     private static Student DeserializeObject(char[] objArr, Student metaStr) 
     { 
      int size = Marshal.SizeOf(metaStr); 
      IntPtr ptr = Marshal.AllocHGlobal(size); 
      Marshal.Copy(Encoding.UTF8.GetBytes(objArr), 0, ptr, size); 
      Marshal.PtrToStructure(ptr, metaStr.GetType()); 
      Marshal.FreeHGlobal(ptr); 
      return metaStr; 
     } 
+0

Danke Kentonbmax für Ihre schnelle Antwort! Ja, in Byte [] Array funktioniert es, aber ich muss es an die C++ - Methode übergeben, die char [] als Parameter akzeptiert. Das ist der Grund, warum ich versuchte, es in char [] Array zu konvertieren. Ich bin mir nicht sicher, was ich hier vermisse. –

+1

Ist der Fluss, serialisieren, übergeben an COM, Get von COM, deserialize? – Kentonbmax

+0

Bitte beachten Sie mein aktuelles Beispiel. – Kentonbmax