C# 跨平台应用中的二进制格式化程序

C# 跨平台应用中的二进制格式化程序,c#,android,winforms,xamarin,C#,Android,Winforms,Xamarin,我正在创建跨平台应用程序。我正在尝试用android反序列化文件。在windows中一切正常。这是我的代码: [Serializable] //serializacja potrzebna do zapisywania do pliku. public class dane { public byte[] id { get; set; } public byte[] login { get; set; } public byte[] haslo { get; set; }

我正在创建跨平台应用程序。我正在尝试用android反序列化文件。在windows中一切正常。这是我的代码:

[Serializable] //serializacja potrzebna do zapisywania do pliku.
public class dane
{
    public byte[] id { get; set; }
    public byte[] login { get; set; }
    public byte[] haslo { get; set; }
    public byte[] link { get; set; }
    public byte[] opis { get; set; }
    public byte[] dataWygasniecia { get; set; }

    public static List<dane> wczytajDaneDoListy(string sciezka) //deserializacja i wczytywanie danych z pliku
    {
        try
        {
            if (File.Exists(sciezka)) //jesli plik istnieje
            {
                Stream str = File.OpenRead(sciezka); //tworzenie strumienia
                var desrializer = new BinaryFormatter();//obiekt deserializujący
                //var desrializer = new XmlSerializer(typeof(List<dane>)); //dla xml
                var listaDanych = (List<dane>)desrializer.Deserialize(str); //deserializacja do listy<dane>
                str.Close();
                return listaDanych;



            }
            throw new Exception();
        }
        catch (Exception)
        {
            return null; //jesli plik nie istnieje, zwracamy null
        }
    }
    public static void zapiszDaneDoPliku() //serializacja i zapisywanie danych do pliku
    {
        Stream str = File.Create(zmienneGlobalne.sciezkaDoPliku); //tworzenie strumienia
        var serializer = new BinaryFormatter(); //obiekt serializujący
        serializer.Serialize(str, zmienneGlobalne.listaWpisow);
        //serializacja danych do strumienia(w tym wypadku do pliku)
        str.Close();
    }
}
[Serializable]//serializacja potrzebna do zapisywania do pliku。
公营丹麦人
{
公共字节[]id{get;set;}
公共字节[]登录{get;set;}
公共字节[]haslo{get;set;}
公共字节[]链接{get;set;}
公共字节[]opis{get;set;}
公共字节[]dataWygasniecia{get;set;}
公共静态列表wczytajDaneDoListy(字符串sciezka)//反序列化
{
尝试
{
if(File.Exists(sciezka))//jesli plik istnieje
{
Stream str=File.OpenRead(sciezka);//tworzenie struminia
var desrializer=new BinaryFormatter();//obiekt反序列化
//var desrializer=新的XmlSerializer(typeof(List));//dla xml
var listaDanych=(List)desrializer.Deserialize(str);//deserializacja do listy
str.Close();
返回listaDanych;
}
抛出新异常();
}
捕获(例外)
{
返回null;//jesli plik nie istnieje,zwracamy null
}
}
public static void zapiszDaneDoPliku()//serializacja i zapisywanie danych do pliku
{
Stream str=File.Create(zmieneglobalne.sciezkaDoPliku);//tworzenie struminea
var serializer=new BinaryFormatter();//obiekt serializujący
serializer.Serialize(str,zmieneglobalne.listaWpisow);
//Strumineia的danych系列(w tym wypadku do pliku)
str.Close();
}
}
当我在安卓系统中使用Xamarin时,调试程序停止工作,没有异常消息。错误出现在第行:

var listaDanych = (List<dane>)desrializer.Deserialize(str);
var listaDanych=(List)desrializer.Deserialize(str);
如果我使用的是XmlSerializer,那么它就是wokring,没有问题。 如何反序列化二进制文件?
如果android不支持BinnaryFormat,我可以使用其他一些方法将其序列化到文件中。XML序列化是最后一种方式,因为我希望我的文件尽可能难以读取。

如果您希望它不受平台影响,请使用基于JSON或XML的序列化程序。二进制序列化通常生成更小的文件,通常速度更快,但它更难编码,并且可能与平台无关

如果您倾向于使用二进制序列化,请查看Protobuf serialiser

请注意,没有序列化可以保护您的文件。如果有人想看看里面,他们会的。如果要保护内容,通常应遵循以下步骤:

  • 找出一种安全存储加密密钥的方法
  • 从序列化数据获取字节
  • 使用密钥和强算法(如AES)加密这些字节
  • 将结果保存到二进制文件中
若您需要将这些数据发送到其他地方,比如提交到web服务,那个么您需要将字节编码为base64


读取此文件的顺序正好相反

如果您想让它难以读取,请在序列化后对其进行加密。使用AES,您只需指定一点信息。我知道,我可以做到,我的应用程序使用AES,但我想知道如何在Android中使用二进制格式化程序。二进制格式化程序,或者任何其他可以在windows和android中创建二进制文件的工具。为什么?如果你创建了一个二进制文件,任何人仍然可以用正确的(容易获得的)信息来读取它。如果你真的想保护它,用AES加密它。来扩展我的知识。知道为什么这不起作用,为什么它会毫无例外地崩溃,以及如何解决这个问题,这将是很酷的。@titol你会得到什么错误?是否可以使用堆栈跟踪复制/粘贴完整异常?或者至少是messageSure的例外,我明白了,序列化不是平等的保护。正如您所看到的,我的类中的数据是byte[]。我使用这种类型,因为这是用AES加密的。我的意思是,若用户试图用记事本编辑文件,我希望他看到整个混乱,就像二进制文件输出一样。同样令人好奇的是,这种序列化在Windows上运行得非常好,但在Android上却不太好。