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 功能(确保您的 Book 是结构,因为编组仅支持 Gemalto .net 卡中的结构和原始类型):
Console.WriteLine(service.getTheBook(0).getName());