Gemalto .NET カードには、データ ストレージに使用される永続メモリと揮発性メモリの両方が含まれています。永続メモリは、カードの永続ストレージとして機能します。カードがスマート カード リーダーから取り外された後でも、データは保持されます。カードの電源が失われ、永続的なストレージとして使用できなくなると、揮発性メモリがリセットされます。
どのようにデータを保存し、どのように BookList にデータを入力しますか? もっと明確にしてください。
もちろんメモリには制限があるため、特定のサイズまで保存することはできません。この .net カードには、16KB の揮発性メモリ (RAM) と 70KB の永続メモリ (アセンブリ、ストレージ メモリを含む) があります。
一部の Gemalto .net カードでテストしたところ、永続ストレージ メモリに 20KB のデータを格納できました。その制限の後、同じ例外 OutOfMemoryException が発生しました (他の 50KB はファイルやアセンブリで満たされているため)。
このカードは、データベースや記録などを保存するようには設計されておらず、キーやパスワードなどの重要な情報を保存するために使用されます。したがって、このサイズを超えて保存しないでください。コードは問題ありません。または、(クライアント アプリケーションで) テキスト圧縮アルゴリズムを使用して、カードに保存する前にサイズを縮小しますが、最終的にはこれを超えて保存しようとしないでください。 ~XX KB。
更新: この制限により、永続ストレージに 70K を超えるデータを保存することはできません。また、カードからクライアントに 16KB を超えるデータを取得することもできません (このデータはローカル変数、つまり揮発性メモリに保存され、クライアントに取得され、ここにも制約があります)。
これが問題の原因です。揮発性メモリが保持できる以上のものを取得します。
public string getBook(int index)
{
return bookList[index].getId() + " , " + bookList[index].getName();
}
戻り値の前に、このデータは一時的に変数になり、16KB を超えて保存できないため、例外 OutOfMemoryException が発生します。
解決策は、このストレージをクライアントから直接使用することです (参照があるので、それを使用してください)。
public Book getTheBook(int index)
{
return bookList[index];
}
クライアントから Book 機能にアクセスできます (マーシャリングは Gemalto .net カードの構造体とプリミティブ型でのみサポートされているため、Book が構造体であることを確認してください):
Console.WriteLine(service.getTheBook(0).getName());