1

私は .Net フレームワークを使用して、Gemalto スマート カード (追加と取得) と対話するアプリケーションを開発しています。追加部分を連続して実行しましたが、カードに保存したデータを読み取ろうとすると、ホスト アプリケーションで outOfMemoryException が発生しましたが、なぜこれが発生するのか誰でも理解できますか?

これは、カードから読み取るホスト アプリケーションのコードです。

for (int i = 0; i < 5; i++)
{
     try
     {
          string bookString = service.getBook(i);
     }catch (Exception x) { 
          MessageBox.Show("an error occur");
     }
}

カードにロードされているアプリには、次のメソッドがあります。

public string getBook(int index) 
{
     return BookList[index].getBookID() + " , " + BookList[index].getBookDesc();
}
4

3 に答える 3

1

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());
于 2013-04-14T08:14:10.417 に答える
0

この例外は、長い文字列 (100 語など) を取得しようとしたときにのみ発生しました。一部の追加は完了しましたが、BookDesc の文字列を送信するだけで完了しました。

public Book[] BookList=new Book[5];
public static int noOfBooks=0;

public string addBook(string bookDesc) 
{
   Book newBook=new Book();
   newBook.setBookDesc(bookDesc); 
   newBook.setBookID(noOfBooks);        
   BookList[noOfBooks]=newBook;
   noOfBooks++;
}
于 2013-04-14T08:42:09.820 に答える