1

そこで、独自のバイナリ シリアライゼーションを実装したいと考えています。私を正しい方向に導くための例を探しています。

また、独自のシリアライザー クラスを作成するか、ISerializable を実装して BinarySerializer を使用する方がよいでしょうか? Iserializable を実装すると、BinarySerializer のアセンブリの読み込み/バージョン依存の問題を回避できますか?

4

2 に答える 2

2

Marc Gravell (スタック オーバーフロー担当者) によって書かれたprotobuf-net を確認してください。

もちろん、そうしなければならない場合を除き、自分で実装することは避けます。プロジェクトはオープンソースなので、チェックアウトできます。

うんざりした後、私は今これを使用していますBinaryFormatter

protobuf の使用は簡単で超高速であり、アセンブリの読み込みやバージョン依存の問題は発生しません。

ああ、パフォーマンス統計が必要な場合は、これをチェックしてください。速い!

の代替について同様の質問をしましたBinaryFormatter

于 2011-04-14T15:49:28.367 に答える
0

これはvb.netの例です

一部のC#から変換したので、コンパイルされない場合は申し訳ありませんが、役に立てば幸いです

c# コードも投稿しました。

シリアル化されたオブジェクトを永続化する必要がある場合は、ms sql を使用している場合は base64 を ntext 型に使用することをお勧めします.....

私の例では、vb.net で this または me のオブジェクト全体をシリアル化しますが、完全に制御したい場合や、セキュリティの問題を引き起こす可能性のあるセキュリティ属性の問題に遭遇する場合があります。その場合は、個々のフィールドをシリアル化し、シリアル化を削除できます。属性。そのため、個々のフィールドをシリアル化するコードを含めました-それらはコメントアウトされています

.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();

        }

    }
}
于 2011-04-14T17:45:19.073 に答える