2016-03-30 30 views
0

Yapı nesnesini serileştirmeye çalıştığım belirli koşullar için C# .NET compact framework 2.0 kullanıyorum.Marshaling nesnesi farklı bir değer döndürüyor

.NET 2.0 CF'nin bu özelliği olmadığından, ben Marshaling nesnesiyim.

Ben mümkün yapmak olabilir ancak sorun nesnenin unmarshaling sonradır,

Ben farklı nesne değerini alıyorum.

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

//// yöntemde:

Kod blokları aşağıda verilmiştir herkes yanlış burada ne yapıyorum önerebilir

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; 
      } 

O büyük olacak .

cevap

0

Sorun, Convert.ToBase64String'dir. Aşağıdaki çalışma örneğine bakın. Ayrıca, bir COM nesnesinden gelen char [] öğesinin, .NET'te serileştirme sırasında dikkate alınması gereken farklı kodlamaya (UTF8) sahip olacağını unutmayın.

 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

Hızlı cevabınız için teşekkürler Kentonbmax! Evet byte [] dizisi çalışır ancak char [] parametresini parametre olarak alan C++ yöntemine geçirmem gerekir. Bu onu char [] dizisine dönüştürmeye çalışmamın sebebi. Burada ne eksik olduğumdan emin değilim. –

+1

Akış, serileştiriliyor, COM'a geçiyor, COM'dan alın, seri hale getirilsin mi? – Kentonbmax

+0

Lütfen güncellenmiş örneğime bakın. – Kentonbmax