在没有ContentManager的Android MonoGame上加载stream/资源

在我正在开发的游戏中,我创建了一个可序列化的类,用于生成用于保存和加载级别的.map文件。 在XNA中,使用以下代码可以很好地工作:

FileStream fileStream = new FileStream(filePath, FileMode.OpenOrCreate); BinaryFormatter formatter = new BinaryFormatter(); MapInfo data = (MapInfo)formatter.Deserialize(fileStream); 

不幸的是,在Android中,似乎filePath最终在设备的根(参数被作为“Content / maps”传入)。 经过一番研究,我从xamarin中看到了这个页面 ,它解释了如何从资产文件夹中正确加载资源。 然而,这个动作发生在与我的主要活动不同的命名空间中,到目前为止还没有find访问Assets.Open()函数的方法。

任何其他方式来加载资产?

更新:在玩了更多之后,我最终试图通过函数调用向下传递主要活动的Assets属性,以这种方式加载文件:

 Stream fileStream = androidGame.Assets.Open(filePath); BinaryFormatter formatter = new BinaryFormatter(); MapInfo data = (MapInfo)formatter.Deserialize(fileStream); 

SADLY,该文件仍然无法加载。 查看debugging中的variables显示variablesandroidGame中包含的活动的正确地址,但是打开是“未知成员”

更新工作解决scheme:

如果任何人遇到Monogame Android中的文件加载问题,这就是我最终做的事情:

首先,确保你在你的android版本的正确目录中复制/引用你的文件。 这应该显示在Assets / Content / yourfile.file或子文件夹下的某处。

然后,检查文件的属性,select“AndroidAsset”作为构建选项,select“Copy if newer”作为输出。

最后,使用主要活动的Assets属性打开stream。 这可以通过以下方式使用Microsoft.Xna.Framework.Game类访问:

 Stream fileStream = Game.Activity.Assets.Open(path); 

原来我的问题不是stream本身,但无法在android中打开.dll的反序列化(忽略了一个…)。 我结束了切换到XML序列化,因为二进制序列化依赖

我相信你可以在MonoGame中使用TitleContainer.OpenStream来实现读写文件的独立平台。

请参阅XNA文档以供参考:

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.titlecontainer.openstream.aspx

你仍然必须小心的是区分大小写,并正确地格式化path。 否则,我认为这是相对简单的。

编辑:其实XNA文档是相当稀疏,所以这里是一个例子,应该给你正确的想法。 如果您的文件位于“内容”文件夹中,并且您已将其设置为“内容/副本”(如果属性中较新)。

 var filePath= Path.Combine(Content.RootDirectory, "FileName.dat"); using(var stream = TitleContainer.OpenStream(filePath)) { BinaryFormatter formatter = new BinaryFormatter(); MapInfo data = (MapInfo)formatter.Deserialize(stream); // do your thing here }