33

オブジェクトとその結果をバイナリでシリアル化し、データベースに保存したいと考えています。

Person person = new Person();
person.Name = "something";

MemoryStream memorystream = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(memorystream, person);

データベースに保存するためにメモリストリームを文字列型に変換し、その後オブジェクトを逆シリアル化できるようにするにはどうすればよいですか?

4

6 に答える 6

56

あなたが本当に求めているのは、任意のバイナリデータをテキストとして表現し、それを再び変換する安全な方法です。シリアル化されたオブジェクトを格納するという事実は関係ありません。

答えは、ほとんどBase 64を使用することです(例:Convert.ToBase64StringおよびConvert.FromBase64String)。使用しないでくださいEncoding.UTF8.GetString。バイナリデータはエンコードされたテキストデータではないため、そのように扱うべきではありません。

ただし、データベースにバイナリデータのデータ型がありませんか?BLOB、IMAGE、およびBINARYタイプを確認してください...

于 2009-11-17T13:57:20.393 に答える
44

これがサンプルです。TData は [Serializable] とマークする必要があり、すべてのフィールド タイプも指定する必要があります。

    private static TData DeserializeFromString<TData>(string settings)
    {
        byte[] b = Convert.FromBase64String(settings);
        using (var stream = new MemoryStream(b))
        {
            var formatter = new BinaryFormatter();
            stream.Seek(0, SeekOrigin.Begin);
            return (TData)formatter.Deserialize(stream);
        }
    }

    private static string SerializeToString<TData>(TData settings)
    {
        using (var stream = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(stream, settings);
            stream.Flush();
            stream.Position = 0;
            return Convert.ToBase64String(stream.ToArray());
        }
    }
于 2011-05-30T18:16:54.253 に答える
19
//-------write to database-------------------------
Person person = new Person();
person.name = "Firstnm  Lastnm";
MemoryStream memorystream = new MemoryStream(); 
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(memorystream, person);
byte[] yourBytesToDb = memorystream.ToArray();
//here you write yourBytesToDb to database


//----------read from database---------------------
//here you read from database binary data into yourBytesFromDb
MemoryStream memorystreamd = new MemoryStream(yourBytesFromDb);
BinaryFormatter bfd = new BinaryFormatter();
Person deserializedperson = bfd.Deserialize(memorystreamd) as Person;
于 2012-01-04T17:55:01.467 に答える
14

私はこのようなものを使用しました

MemoryStream memoryStream = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, Person);
memoryStream.Flush();
memoryStream.Position = 0;
string value = Convert.ToBase64String(memoryStream.ToArray());
于 2009-11-17T13:57:41.510 に答える
2

基本的に、データを文字列としてデータベースに保存しないblobでください。バイナリデータを保存するために使用できるフィールドがあります。

データを文字列として本当に必要な場合は、byte []をbase64エンコーディングを使用して文字列に変換し、文字列からbyte[]を取得してデコードを使用する必要があります。

于 2009-11-17T13:57:53.960 に答える
0

メモリストリームをbase64hex文字列に変換してデータベースに入れることを検討していませんか?

 byte[] mStream = memorystream.ToArray();
 string sConvertdHex = System.Convert.ToBase64String(mStream)

次に、コンテンツsConvertdHexをデータベースにダンプできます。逆シリアル化するには、逆を行う必要があります

 byte[] mData = System.Convert.FromBase64String(...)

次に、mDataを逆シリアル化してオブジェクトに戻します。

于 2009-11-17T13:58:41.307 に答える