4

コンパイル済みの protobuff シリアライザ クラスでシリアライズされたバイト配列を正常にデシリアライズする際に問題が発生していますModelSerializer。これを使用すると、定義したデータ モデル内のクラスのシリアル化と逆シリアル化はMyData、ファイルにシリアル化し、ファイルからMyData.

ただし、別の要件があります。それはMyData、バイト配列にシリアル化し、バイト配列を に逆シリアル化することMyDataです。以下は、バイト配列に変換するメソッドとバイト配列をMyDataConverterに変換するメソッドの 2 つの静的メソッドを持つ、呼び出される基本クラスです。MyDataMyData

バイト配列に正常にシリアル化MyDataし、MemoryStream. ただし、バイト配列を逆シリアル化すると、null 以外の のインスタンスが得られますがMyData、その中のすべてのデータが失われます (ゼロのデフォルト、またはnullカスタム型の値)。

ここで間違っていたのでしょうか?同様のコードを使用して、ファイルへのシリアル化とファイルからの逆シリアル化を正常に行ったことに注意してください。したがって、おそらく MyModel や事前にコンパイルされた ModelSerializer に問題はありません。ただし、必要に応じて、その情報の一部をここに貼り付けることができます。

public class MyDataConverter
{
    public static byte [] MyDataToBytes (MyData myData)
    {
        MemoryStream stream = new MemoryStream();
        ModelSerializer serializer = new ModelSerializer();

        serializer.Serialize (stream, myData);
        byte [] bytes = stream.ToArray();
        Stream.Close();

        return bytes;
    }

    public static MyData BytesToMyData (byte [] bytes)
    {
        MyData myData = null;

        MemoryStream stream = new MemoryStream();
        stream.Write (bytes, 0, bytes.Length);

        ModelSerializer serializer = new ModelSerializer();

        myData = (MyData) serializer.Deserialize (stream, myData, typeof (MyData));
        stream.Close();

        return myData;
    }
}
4

2 に答える 2

10

これが問題です:

MemoryStream stream = new MemoryStream();
stream.Write (bytes, 0, bytes.Length);

ModelSerializer serializer = new ModelSerializer();
myData = (MyData) serializer.Deserialize (stream, myData, typeof (MyData));

逆シリアル化しようとすると、まだストリームの最後にいます。後で最初にシークすることもできますが、バイト配列をコンストラクターに渡すようにコードを変更する方が簡単です。

MemoryStream stream = new MemoryStream(bytes, false);        
ModelSerializer serializer = new ModelSerializer();
myData = (MyData) serializer.Deserialize (stream, myData, typeof (MyData));
于 2013-02-21T16:08:08.910 に答える
-1

List のようなオブジェクトのリストをシリアライザへの入力として渡すことはできますか。

于 2016-05-20T19:02:44.280 に答える