.NET: Как двоично сериализовать объект с атрибутом [DataContract]? - PullRequest
7 голосов
/ 05 марта 2010

Класс, помеченный как [DataContract], не может быть ISerializable одновременно. Хорошо, как я могу сериализовать объект этого типа в двоичный поток?

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

Я не могу заставить это работать, если Комната не ISerializable. Как я могу получить байтовый массив из объекта другим способом?

Ответы [ 3 ]

27 голосов
/ 11 октября 2012

Код для сериализации и десериализации с использованием двоичного форматера:

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");
}
3 голосов
/ 07 марта 2010

Решение состоит в том, чтобы использовать DataContractSerializer для сериализации объекта.

0 голосов
/ 05 марта 2010

Это принцип двоичной сериализации: сериализуются только классы [Serializable] (хотя я, возможно, читал, что это ограничение недавно было снято) Если вы хотите взять на себя управление процессом сериализации, внедрите ISerializable.

Если в классе Room есть несериализуемые члены, вам также понадобится ISerializable.

Что такое члены комнаты?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...