Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将.net类序列化到磁盘_C#_.net - Fatal编程技术网

C# 如何将.net类序列化到磁盘

C# 如何将.net类序列化到磁盘,c#,.net,C#,.net,我正在尝试将对象缓存序列化到磁盘,以便下次加载程序时可以加载它。 正在保存的类的一个特性是它包含对其他对象的引用。 例如: 我有一个图像类的列表,其中存储远程url、本地文件路径(如果已下载)等。。。。然后,我将可见性绑定到已下载文件,并将源绑定到本地文件路径。 其他对象有对此图像的引用,因此,当下载图像时,它会更新一次,并且所有指向它的项目的绑定都会更新 作为一个快速解决方案,我实现了一个二进制格式化程序,所有这些都正常工作。我的所有列表都被序列化到磁盘,当我重新加载它们时,所有引用都保留下来

我正在尝试将对象缓存序列化到磁盘,以便下次加载程序时可以加载它。 正在保存的类的一个特性是它包含对其他对象的引用。 例如: 我有一个图像类的列表,其中存储远程url、本地文件路径(如果已下载)等。。。。然后,我将可见性绑定到已下载文件,并将源绑定到本地文件路径。 其他对象有对此图像的引用,因此,当下载图像时,它会更新一次,并且所有指向它的项目的绑定都会更新

作为一个快速解决方案,我实现了一个二进制格式化程序,所有这些都正常工作。我的所有列表都被序列化到磁盘,当我重新加载它们时,所有引用都保留下来(即创建一个图像对象,使用它的所有对象都有一个引用,而不是每次出现时反序列化创建一个新的图像实例)

我的问题是,在不破坏引用的情况下,我应该使用哪种序列化器来存储到磁盘?我读到BinaryFormatter对于序列化到磁盘并期望它在不同版本中工作是一个糟糕的选择。虽然到目前为止我还没有遇到任何问题,但我不想在一年后遇到问题,迫使我的所有用户重新获取他们所有的缓存元数据

我不能100%确定所有不同的序列化程序是如何工作的,但我认为如果我要使用XML,我可能需要编写某种转换器。如果有帮助的话,我所有的图像对象都有一个分配给它们的GUID,所以我对每个对象都有一些独特的东西

更新:我刚刚发现以下问题,看起来很相似
有谁能告诉我,与binaryformatter的缺点相比,Datacontractserializer是否是跨不同版本应用程序进行长期序列化存储的好选择?

不需要任何转换器和其他东西,只需查看以下内容:


不需要任何转换器和其他东西,只需查看以下内容:


MongoDb可能有用。看见 或其他类型的数据库:


而且似乎SQLite很有用。使用blob将图像存储为二进制。

MongoDb可能有用。看见 或其他类型的数据库:


而且似乎SQLite很有用。使用blob将图像存储为二进制。

可能会有帮助,它的易用性。

可能会有帮助,它的易用性。

文章指出“需要记住的一点是,基本的XML序列化不会维护引用。”“现在我有一个列表,其中包含两个完全相同的电影参考。当我序列化和反序列化这个列表时,它将被转换为电影对象的两个独立实例——它们只会有相同的信息。同样,XMLSerializer也不支持循环引用。如果你需要这种灵活性,你应该考虑二进制序列化。“所以这似乎不足以满足要求。啊,错过了那部分…谢谢!!……-嗯,你的文章帮助了我在寻找什么,我想我已经找到了答案仍然有用。好!很高兴我能帮助,以某种方式;-”文章说:需要记住的一点是,基本的XML序列化不会维护引用。”“现在我有一个列表,其中包含两个完全相同的电影引用。当我序列化和反序列化这个列表时,它将被转换为电影对象的两个独立实例——它们只会有相同的信息。同样,XMLSerializer也不支持循环引用。如果你需要这种灵活性,你应该考虑二进制序列化。“所以这似乎不符合要求。啊,错过了那部分。。谢谢!:-)好吧,你的文章帮助我搜索了什么,我想我已经找到了仍然有用的答案。很好!很高兴我能以这样或那样的方式提供帮助;-)你知道我会从这个Vs sql ce中获得什么样的性能吗?我使用sql ce,但远远不能满足我的需求,这就是为什么我必须找到另一个解决方案来解决这个问题。你可以看到更多类似的解决方案。但是SQLite似乎对你的问题有很好的性能。你知道我从这个Vs sql ce中获得了什么样的性能吗?我使用sql ce,但速度远远慢于我的要求,这就是为什么我必须找到解决问题的另一个解决方案。你可以看到更多类似的解决方案。但SQLite似乎在解决您的问题方面有很好的性能。看看@oleksii,您意识到这与对象序列化完全无关,对吧?@MarcGravel不,对不起,我没有意识到这一点。我发表评论是因为(我相信你比我更清楚)redis是一个分布式缓存提供程序,它具有将数据持久化到驱动器中的内置功能。如果此功能已经在行业解决方案中实现,为什么要重新发明轮子?我并没有把它作为一个答案,因为我确实意识到,对redis产生新的依赖可能并不简单(或不可取)。如果我错了,请纠正我。我建议将您的缓存仅作为临时存储。如果要从磁盘重新加载,则它必须仍然有效。如果缓存数据(时间、版本等)过期,则需要添加一种使其无效的方法。缓存数据来自何处?如果您试图同时从原始源(db)和缓存加载,那么您将拥有两个独立的对象,除非您在内存中有一个自定义方法来“匹配”它们。看看@oleksii,您会发现这与对象序列化完全无关,对吧?@MarcGravel不,对不起,我没有意识到这一点。我发表评论是因为(我相信你比我更清楚)redis是一个分布式缓存提供程序,它具有将数据持久化到驱动器中的内置功能。如果此功能已经在行业解决方案中实现,为什么要重新发明轮子?我并没有把它作为一个答案,因为我确实意识到,对redis产生新的依赖可能并不简单(或不可取)。如果我错了,请纠正我。我会建议的