1

カスタムオブジェクトの逆シリアル化中にこのエラーに直面しました。カスタムクラスのコレクションをSQLデータベースに挿入して取得しようとしていますが、挿入はうまくいきますが、データを取得して逆シリアル化すると、このエラーが発生します私のコードサンプル:

        private void InsertObject()
    {
        ReceiptCollection items = SqlDataRepository.ReceiptProvider.GetAll();

        string connectionString = "my connection";

        System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(connectionString);

        string sql = "INSERT INTO [dbo].[LogHeader]([MasterObject]) VALUES (@MasterObject)";

        BinaryFormatter binaryFormatter = new BinaryFormatter();
        MemoryStream memoryStream = new MemoryStream();
        binaryFormatter.Serialize(memoryStream, items);

        using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, connection))
        {
            byte[] bytes = new byte[memoryStream.Length];
            memoryStream.Write(bytes, 0, bytes.Length);

            connection.Open();
            cmd.Parameters.AddWithValue("@MasterObject", bytes);
            cmd.ExecuteNonQuery();
        }
    }

    private void RetrieveObjects()
    {
        string connectionString = "my connection";
        System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(connectionString);

        string sql = "Select MasterObject From [dbo].[LogHeader] WHERE LogHeaderID=2";

        using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, connection))
        {
            connection.Open();
            byte[] bytes = (byte[])cmd.ExecuteScalar();

            BinaryFormatter binaryFormatter = new BinaryFormatter();
            MemoryStream memoryStream = new MemoryStream(bytes);
            memoryStream.Position = 0;
            ReceiptCollection items = (ReceiptCollection)binaryFormatter.Deserialize(memoryStream); // the error happened here
        }
    }
4

2 に答える 2

2

カスタムクラスのシリアル化と逆シリアル化で同じ問題に直面していました。どこを見ても、解決策としてマークされた同じコードがあります(コードが一番上に表示されています)が、正しく実行できませんでした。memoryStream.Write() メソッドの後に受け取っていたのは、ゼロの配列だけでした。コードを変更して動作させました。

私がしたことは(あなたのコードに実装されています):

    BinaryFormatter binaryFormatter = new BinaryFormatter();
    MemoryStream memoryStream = new MemoryStream();
    binaryFormatter.Serialize(memoryStream, items);

    using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, connection))
    {
        byte[] bytes = new byte[memoryStream.Capacity];
        bytes = memoryStream.GetBuffer();

        connection.Open();
        cmd.Parameters.AddWithValue("@MasterObject", bytes);
        cmd.ExecuteNonQuery();
    }

これは、バイト配列をデータベースに送信するためのものです。それを取得するために、次のことを行いました。

    connection.Open();
    byte[] bytes = (byte[])cmd.ExecuteScalar();

    BinaryFormatter binaryFormatter = new BinaryFormatter();
    using (MemoryStream memoryStream = new MemoryStream(bytes))
    {
        memoryStream.Position = 0;
        ReceiptCollection items = (ReceiptCollection)binaryFormatter.Deserialize(memoryStream);
    }

それを試してみてください!それは本当に私のために働きました。

于 2013-07-16T17:10:10.113 に答える