.NET:如何对具有[DataContract]属性的对象进行二进制序列化?

标签 .net wcf

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

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

没有Room可序列化,我无法使其正常工作。
如何从对象中获取字节数组?

最佳答案

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

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

关于.NET:如何对具有[DataContract]属性的对象进行二进制序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2383380/

相关文章:

c# - 如何绘制运动中的椭圆?

WCF 和多种安全模型

asp.net - 缓存 WCF 服务并将数据转换为异步

c# - WCF 捕获异步异常

wcf - ReadAsAsync<T>,需要来自命名空间 'http://schemas.datacontract.org/2004/07/"的元素,遇到 'Element',名称为 'workflow',命名空间 ''

c# - 类型 '*' ,作为 ServiceHost 指令中的 Service 属性值提供,或在配置元素中提供 * 无法找到

c# - 为什么 Int32.ToString() 发出调用指令而不是 callvirt?

c# - 将 C# 对象序列化为特定类型的多维 JSON 数组

.net - F# 中 CLI 事件的 C# 样式事件访问器

.net - IKVM.Reflection.Emit 和 Mono.Cecil 的区别