【问题标题】:XML Serializing and Deserializing List Data in Android AppAndroid App中的XML序列化和反序列化列表数据
【发布时间】:2016-10-24 20:23:10
【问题描述】:

所以我正在尝试反序列化和序列化一个列表。

问题:list(list1) 没有保存到名为“ListData”的文件中,如果还没有,则应将其创建到 android 内部存储中的文档文件夹中。

我认为文件可能没有正确创建或其他什么,或者文件路径不正确。下面是它应该如何运作,但它不像上面的问题所解释的那样运作。

我想将文件名保存为“ListData”之类的名称。 此外,需要保存到内部存储中的某个位置,例如应用程序的数据文件夹或内部存储中的文档。

以下是我的代码,但我似乎无法在其他地方找到任何帮助来解决我的问题。它不起作用,有什么想法可以解决我想要它做的事情吗?

代码:

public abstract class DataHandler
{
    public static void SaveLists()
    {
        string filePath = Android.OS.Environment.DirectoryDocuments;
        string fileName = "ListData";

        XmlSerializer serializer = new XmlSerializer(typeof(List<Item>));
        Stream writer = new FileStream(filePath, FileMode.Create);

        serializer.Serialize(writer, _LISTFROMANOTHERCLASS_);

        writer.Close();
    }

    public static void LoadLists()
    {
        string filePath = Android.OS.Environment.DirectoryDocuments;
        string fileName = "ListData";

        XmlSerializer serializer = new XmlSerializer(typeof(List<Item>));
        Stream reader = new FileStream(filePath, FileMode.Open);
        List<Item> list1 = new List<Item>();

        list1 = (List<Item>) serializer.Deserialize(reader);
        _LISTFROMANOTHERCLASS_ = list1;

        reader.Close();

    }
}

【问题讨论】:

  • 有什么问题?
  • 请定义“不起作用”。它做什么或不做什么?你有异常或错误吗?另外,考虑使用 Newtonsoft.JSON 进行序列化。它与 Xamarin 配合得很好,并且有很好的文档记录。
  • 问题:list(list1) 没有保存到名为“ListData”的文件中,如果还没有,则应将其创建到 android 内部存储的文档文件夹中。
  • @Jason 我已经添加了,谢谢

标签: c# android xml serialization xamarin


【解决方案1】:

您好,我已经编写了一个类来执行这些操作,但是通过 JSON 序列化检查是否有助于它使用 MVVM Cross,它编写了用于加密和解密数据的代码,您可以避免这些部分

 public class PersistantStorageHelper<T>
    {
        IMvxFileStoreAsync _mvxFileStoreAsync;
        IMvxFileStore _mvxFileStore;
        EDEngine bcEngine = new EDEngine(new AesEngine(), Encoding.UTF8);
        string currentkey_temp_dev = "AthulHarikumar00";//This static key is not being used it is a just a place holder

        public PersistantStorageHelper() {
            this._mvxFileStore = Mvx.Resolve<IMvxFileStore>();
            this._mvxFileStoreAsync = Mvx.Resolve<IMvxFileStoreAsync>();
            bcEngine.SetPadding(new Pkcs7Padding());
            currentkey_temp_dev = Constants.PassPhrase.Substring(4, 12)+"Road";
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public async Task<T> GetPersistantObject(T obj)
        {
            var fileName = (typeof(T).ToString().Replace(".", "_"));
           var x= await GetPersistantObject(obj, fileName);
            return x;
        }
        /// <summary>
        /// If object exists returns the object else saves a plain object and returns it
        /// </summary>
        /// <param name="obj">empty placeholder object</param>
        /// <returns>Filesystem object</returns>
        public async Task<T> GetPersistantObject( T obj,string fileName) {

            List<string> files = new List<string>(_mvxFileStore.GetFilesIn(_mvxFileStore.NativePath("")));
            fileName = _mvxFileStore.NativePath(fileName);

            if (!files.Contains(fileName))
            {
                var objJson = Newtonsoft.Json.JsonConvert.SerializeObject(obj);

                objJson= bcEngine.Encrypt(objJson, currentkey_temp_dev);
                await _mvxFileStoreAsync.WriteFileAsync(fileName,objJson);
            }
            else {
                try
                {

                    var temp = await _mvxFileStoreAsync.TryReadTextFileAsync(fileName);
                    var str = bcEngine.Decrypt(temp.Result, currentkey_temp_dev);
                    obj = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(str);
                }
                catch(Exception e) {
                    var objJson = Newtonsoft.Json.JsonConvert.SerializeObject(obj);

                    objJson = bcEngine.Encrypt(objJson, currentkey_temp_dev);
                    await _mvxFileStoreAsync.WriteFileAsync(fileName, objJson);
                }
            }

            return obj;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public async Task<T> SetPersistantObject(T obj)
        {
            var fileName = _mvxFileStore.NativePath(typeof(T).ToString().Replace(".", "_"));
            var temp = await SetPersistantObject(obj, fileName);
            return temp;

        }
        /// <summary>
        /// Saves object to persistant storage with encryption
        /// </summary>
        /// <param name="obj">object to be stored</param>
        /// <returns>Saved object</returns>
        public async Task<T> SetPersistantObject(T obj,string fileName)
        {

            List<string> files = new List<string>(_mvxFileStore.GetFilesIn(_mvxFileStore.NativePath("")));
             fileName = _mvxFileStore.NativePath(fileName);


                var objJson = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
            objJson = bcEngine.Encrypt(objJson, currentkey_temp_dev);
            await _mvxFileStoreAsync.WriteFileAsync(fileName, objJson);



            return obj;
        }
    }

【讨论】:

    【解决方案2】:

    java.util.List 不可序列化,但 java.util.ArrayList 可以。因此,只需在两个站点上将 List 更改为 ArrayList (变量名之前的左侧和构造函数的右侧)。还要检查你的 Item 是否实现了 Serializable

    【讨论】:

    • 我不认为这有助于完整地回答这个问题,但还是谢谢你。
    猜你喜欢
    • 2012-02-02
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    相关资源
    最近更新 更多