标记为[DataContract]的类不能同时进行ISerializable。好的,那么如何将这种类型的对象序列化为二进制流呢?
private byte[] GetRoomAsBinary(Room room)
{
MemoryStream stream = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(stream, room);
return stream.ToArray();
}
如果没有可以进行ISerializable的会议,我就无法工作。 如何以其他方式从对象获取字节数组?
答案 0 :(得分:27)
使用二进制格式化程序序列化和反序列化的代码:
public static class BinarySerializer
{
public static byte[] Serialize<T>(T obj)
{
var serializer = new DataContractSerializer(typeof(T));
var stream = new MemoryStream();
using (var writer =
XmlDictionaryWriter.CreateBinaryWriter(stream))
{
serializer.WriteObject(writer, obj);
}
return stream.ToArray();
}
public static T Deserialize<T>(byte[] data)
{
var serializer = new DataContractSerializer(typeof(T));
using (var stream = new MemoryStream(data))
using (var reader =
XmlDictionaryReader.CreateBinaryReader(
stream, XmlDictionaryReaderQuotas.Max))
{
return (T)serializer.ReadObject(reader);
}
}
}
<强>用法:强>
public void TestBinarySerialization()
{
// Create the person object.
Person person = new Person { Name = "John", Age = 32 };
// Serialize and deserialize the person object.
byte[] data = BinarySerializer.Serialize<Person>(person);
Person newPerson = BinarySerializer.Deserialize<Person>(data);
// Assert the properties in the new person object.
Debug.Assert(newPerson.Age == 32);
Debug.Assert(newPerson.Name == "John");
}
答案 1 :(得分:3)
解决方案是使用DataContractSerializer来序列化对象。
答案 2 :(得分:0)
这是二进制序列化的原则:只能序列化[Serializable]类(虽然我可能已经读过这个限制最近被解除)。 如果要控制序列化过程,请实现ISerializable。
如果Room类具有不可序列化的成员,那么您也需要ISerializable。
Room的成员是什么?