Szukam obsługi serializacji w języku C#. Mogłem czerpać z ISerializable i wdrażać serializację, kopiując wartości członków w buforze bajtowym. Wolałbym jednak bardziej automatyczny sposób jak w C/C++.Byte dla serializacji bajtów struktury w C#
Rozważmy następujący kod:
using System;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
namespace XBeeHelper
{
class XBee
{
[Serializable()]
public struct Frame<FrameType> where FrameType : struct
{
public Byte StartDelimiter;
public UInt16 Lenght;
public Byte APIIdentifier;
public FrameType FrameData;
public Byte Checksum;
}
[Serializable()]
public struct ModemStatus
{
public Byte Status;
}
public Byte[] TestSerialization()
{
Frame<ModemStatus> frame = new Frame<ModemStatus>();
frame.StartDelimiter = 1;
frame.Lenght = 2;
frame.APIIdentifier = 3;
frame.FrameData.Status = 4;
frame.Checksum = 5;
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, frame);
Byte[] buffer = stream.ToArray();
return buffer;
}
}
}
Mam rodzajowe Rama struct działając jako otoczka do wielu rodzajów ładunku, dla transmisji szeregowej. ModemStatus jest przykładem takiego ładunku.
Jednak uruchomienie funkcji TestSerialization() zwraca bufor o długości około bajtów (bez oczekiwanej zawartości)! Powinien zawierać 6 bajtów. Czy możliwe jest prawidłowe serializowanie tych danych bez ręcznego serializowania?
Mogłeś napisane, że w ciągu pół kodu ... – leppie
Niestety wykopać przeszłości, ale ten kod jest straszne. XmlSerializer nie jest IDisposable, więc nie może być w użyciu instrukcja.'new MemoryStream()' jest tworzony i usuwany, ale nigdy nie jest używany. 'memoryStream' jest przypisane dwa razy, co nie spowoduje kompilacji, ponieważ jest częścią instrukcji using. 'UTF8ByteArrayToString()' i 'StringToUTF8ByteArray()' po prostu nie są nigdzie zdefiniowane. Może mógłbyś trochę czasu, aby to naprawić, teraz masz więcej doświadczenia? –