有时,当我保存到XML时,我最终得到一个完全空的XML文件。
我无法按需复制问题。这只是偶尔的。在这方面是否有人可以采取措施来帮助用户?
目前我这样做:
library(tidyr)
library(ggmap)
library(ggplot2)
map <- get_map(location = 'Manchester', zoom = 9, scale = 2)
dat <- dat %>%
separate(Start.lon.lat., c("Start.Lat", "Start.Lon"), sep =",") %>%
separate(End.lon.lat., c("End.Lat", "End.Lon"), sep =",")
ggmap(map) +
geom_segment(data = dat, aes(x = as.numeric(Start.Lon),
y = as.numeric(Start.Lat),
xend = as.numeric(End.Lon),
yend = as.numeric(End.Lat)))
我没有在catch块中放置任何内容的原因是因为此代码是C#DLL的一部分,我从MFC项目调用它。我已经读过你不能(或不应该)将异常从一个环境传递到另一个环境。因此,当我的DLL中发生异常时,我真的不知道如何将这些信息明智地提供给用户,以便他们可以看到它。这是一个副作用。
但这就是我如何拯救它。那么,可以采取哪些步骤来尝试防止完全数据丢失?
谢谢。
我查看了评论中的链接引用的KB article,并指出:
使用以下XmlSerializer类构造函数。这些类构造函数缓存程序集。
这也在评论中指出的article中重新说明:
解决方案是什么?
默认构造函数XmlSerializer(type)和XmlSerializer(type,defaultNameSpace)缓存动态程序集,因此如果使用这些构造函数,则只需要创建动态程序集的一个副本。
看起来很聪明......为什么不在所有构造函数中执行此操作?嗯......有趣的想法,想知道为什么他们没有想到那个:)好吧,其他构造函数用于特殊情况,并且假设您不会使用这些特殊情况创建大量相同的XmlSerializers,这意味着我们会缓存很多我们以后不需要的项目并占用大量的额外空间。有时你必须做对大多数人有利的事情。
那么如果你需要使用其他构造函数,你会怎么做?我建议如果你需要经常使用XmlSerializer来缓存它。然后它只会被创建一次。
我的代码使用了以下默认构造函数之一:
public bool SavePublisherData()
{
bool bSaved = false;
try
{
XmlSerializer x = new XmlSerializer(_PublisherData.GetType());
using (StreamWriter writer = new StreamWriter(_strPathXML))
{
_PublisherData.BuildPublisherListFromDictionary();
x.Serialize(writer, _PublisherData);
bSaved = true;
}
}
catch
{
}
return bSaved;
}
所以我认为在这种情况下我不需要担心这个XmlSerializer(_PublisherData.GetType());
。