Say we have a struct that it\'s data is provided by un-managed byte array using Marshal.PtrToStructure.
The C# struct layout:
[StructLayout(LayoutKin
The XmlSerializer
by default will encode the byte arrays using base 64 encoding. If you use this site and paste in IzE=
, and decode it, the result will be #1
. You can change the encoding by setting the XmlElementAttribute.DataType. I'm not sure if [XmlElement(DataType = "string")]
will work, but you can try it. Using [XmlElement(DataType = "hexBinary")]
will generate the raw bytes.
This is how I did it:
public class MySerializableClass
{
private string dummy;
[XmlElement("NaughtyXmlCharacters")]
public string NaughtyXmlCharactersAsString
{
get
{
return BitConverter.ToString(NaughtyXmlCharacters);
}
set
{
// without this, the property is not serialized.
dummy = value;
}
}
[XmlIgnore]
public byte[] NaughtyXmlCharacters
{
get;
set;
}
}
The bytes are then formatted as hexadecimal values and separated with a minus sign: 00-AF-B1
I got this to work using the following:
public class MySerializableClass
{
[XmlIgnore]
public string NaughtyXmlCharactersAsString { get; set; }
[XmlElement(ElementName = "NaughtyXmlCharacters", DataType = "hexBinary")]
public byte[] NaughtyXmlCharactersAsBytes
{
get { return Encoding.UTF8.GetBytes(NaughtyCharactersAsString ?? string.Empty); }
set { NaughtyXmlCharactersAsString = Encoding.UTF8.GetString(value); }
}
I would then only access the "AsString" version of the property.