.NET:如何使用属性[DataContract]二进制序列化对象?

agn*_*zka 8 .net wcf

标记为[DataContract]的类不能同时进行ISerializable.好的,那么如何将这种类型的对象序列化为二进制流呢?

private byte[] GetRoomAsBinary(Room room)
        {
            MemoryStream stream = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(stream, room);
            return stream.ToArray();
        }
Run Code Online (Sandbox Code Playgroud)

没有Room可以进行ISerializable,我就无法工作.如何通过其他方式从对象获取字节数组?

Pat*_*son 29

使用二进制格式化程序序列化和反序列化的代码:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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");
}
Run Code Online (Sandbox Code Playgroud)


agn*_*zka 3

解决方案是使用DataContractSerializer来序列化对象。

  • `DataContractSerializer` 生成并读取 XML。而且 XML 不是二进制的。 (2认同)