Пример двоичного сериализатора клиента в .Net - PullRequest
1 голос
/ 14 апреля 2011

Итак, я хочу реализовать свою собственную двоичную сериализацию.Я ищу несколько примеров, чтобы направить меня в правильном направлении.

Кроме того, лучше ли мне сделать свой собственный класс сериализатора или просто реализовать ISerializable и использовать BinarySerializer?Если я реализую Iserializable, то обойдется ли проблема с загрузкой сборки / версией версии с BinarySerializer?

Ответы [ 2 ]

2 голосов
/ 14 апреля 2011

Проверьте protobuf-net , написанное Марком Гравеллом (парень из Переполнения стека)

Я бы не стал реализовывать ваши собственные, если, конечно, вам не придется это делать. Проект с открытым исходным кодом, так что вы можете проверить его.

Я теперь использую это после того, как надоело BinaryFormatter

Использование protobuf очень просто и очень быстро, и оно НЕ испытывает проблем с загрузкой сборки / зависимостью от версии.

Да, и если вам нужна статистика производительности, проверьте это . Быстро!

Я задал аналогичный вопрос об альтернативе BinaryFormatter

0 голосов
/ 14 апреля 2011

Вот пример в vb.net

Я преобразовал его из некоторого c #, извините, если он не компилируется, но, надеюсь, поможет вам

Я также разместил код c #.

Если вам нужно сохранить сериализованный объект, я рекомендую использовать base64 для типа ntext, если вы используете ms sql .....

Мой пример сериализует весь объект this или me invb.net, однако иногда вам может потребоваться полный контроль, или вы можете столкнуться с проблемами с атрибутом безопасности, которые могут вызвать проблемы безопасности - если это так, вы можете сериализовать отдельные поля и удалить атрибут serialize.поэтому я включил код для сериализации отдельных полей - они закомментированы

Существует множество способов сериализации объектов в .NET, иногда атрибут Serialize может вызвать проблемы безопасности, тогда вам нужно сериализовать каждое поле.

Imports System.Linq
Imports System.Collections.Generic
Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.IO

Namespace ConsoleApp
    <Serializable> _
    Public Class Example
        Public Property S() As String
            Get
                Return m_S
            End Get
            Set
                m_S = Value
            End Set
        End Property
        Private m_S As String
        Public Property I() As Integer
            Get
                Return m_I
            End Get
            Set
                m_I = Value
            End Set
        End Property
        Private m_I As Integer
        Public Property List() As List(Of String)
            Get
                Return m_List
            End Get
            Set
                m_List = Value
            End Set
        End Property
        Private m_List As List(Of String)
        Public Function Pack() As Byte()
            Dim bf = New BinaryFormatter()
            Using ms = New MemoryStream()
                bf.Serialize(ms, Me)
                '               bf.Serialize(ms, S);
                '               bf.Serialize(ms, I);
                '               bf.Serialize(ms, List);
                Return ms.ToArray()
            End Using
        End Function
        Public Function UnPack(data As Byte()) As Example
            Dim bf = New BinaryFormatter()
            Using ms = New MemoryStream(data)
                    '               S = (string) bf.Deserialize(ms);
                    '               I = (int) bf.Deserialize(ms);
                    '               List = (List<string>) bf.Deserialize(ms);               
                Return DirectCast(bf.Deserialize(ms), Example)
            End Using
            '           return this;
        End Function
        Public Overrides Function ToString() As String
            Return String.Format("[Example: S={0}, I={1}, List={2}]", S, I, [String].Join(",", List.ToArray()))
        End Function
    End Class
    Class MainClass

        Public Shared Sub Main(args As String())

            Dim o1 = New Example() With { _
                Key .S = "James", _
                Key .I = 9, _
                Key .List = New List(Of String)(New String() {"a", "b"}) _
            }
            Dim o2 = New Example().UnPack(o1.Pack())
            Console.WriteLine(o1.ToString())
            Console.WriteLine(o2.ToString())

            Console.ReadLine()

        End Sub

    End Class
End Namespace

C # источник

using System;
using System.Linq;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace ConsoleApp
{
    [Serializable()]
    public class Example {
        public string S {get;set;}
        public int I {get;set;}
        public List<string> List {get; set;}
        public byte[] Pack() {
            var bf = new BinaryFormatter();
            using (var ms = new MemoryStream()) {
                bf.Serialize(ms, this);
//              bf.Serialize(ms, S);
//              bf.Serialize(ms, I);
//              bf.Serialize(ms, List);
                return ms.ToArray();
            }
        }
        public Example UnPack(byte[] data) {
            var bf = new BinaryFormatter();
            using (var ms = new MemoryStream(data)) {
                return (Example) bf.Deserialize(ms);
//              S = (string) bf.Deserialize(ms);
//              I = (int) bf.Deserialize(ms);
//              List = (List<string>) bf.Deserialize(ms);               
            }
//          return this;
        }
        public override string ToString ()
        {
            return string.Format ("[Example: S={0}, I={1}, List={2}]", S, I, String.Join(",", List.ToArray()));
        }
    }
    class MainClass
    {

        public static void Main (string[] args)
        {

            var o1 = new Example() {S = "James", I = 9, List= new List<string>(new string[] {"a", "b"})};
            var o2 = new Example().UnPack(o1.Pack());
            Console.WriteLine(o1.ToString());
            Console.WriteLine(o2.ToString());

            Console.ReadLine();

        }

    }
}
...