首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mvvmcross使用文件插件和json序列化/反序列化保持程序设置

mvvmcross使用文件插件和json序列化/反序列化保持程序设置
EN

Stack Overflow用户
提问于 2014-01-13 23:10:53
回答 1查看 1.5K关注 0票数 0

我正在尝试使用fileplugin和json序列化程序来做这件事。在核心项目中,我有以下DcsSetup类。现在我使用的是droid。我似乎无法保存该文件。json序列化没问题。WriteFile似乎没问题,但下次我尝试使用TryReadTextFile读取该文件时,它会失败。我在设备上找不到文件,所以我认为WriteFile的东西是错误的。在Android上保存和读取设置类的正确方法是什么?

公共类DcsSetup {

代码语言:javascript
复制
public class Settings
{
    //Server
    public string Server;
    public int Port;

    public int Device;

    public string EncodingFromClient;
    public string EncodingToClient;

    public int FontCorrectionPixelsWidth; //Pixels to add or subtract i Y dimension to get the right font size 
    public int FontCorrectionPixelsHeight; //Pixels to add or subtract i Y dimension to get the right font size 

    public float XPct;//Pct to add to vertical placement of textBox and Buttons.
    public float YPct;//Pct to add to horisontal placement of textBox and Buttons.
    public float SizePct;//Pct to add to horisontal size of textBox and Buttons.

    public bool FullScreen;
    public bool DontSleep;


    //Diverse
    public bool AutoSendEnter;
}
public Settings Setting;

public DcsSetup()
{
  var setupFound=true;
  var fileService = Mvx.Resolve<IMvxFileStore>();
  var jsonConvert = Mvx.Resolve<IMvxJsonConverter>();
  var path = fileService.PathCombine("Setting", "Settings.txt");

  Setting = new Settings();

  try {
    string settingFile;
    if (fileService.TryReadTextFile(path, out settingFile)){
      Setting = jsonConvert.DeserializeObject<Settings>(settingFile);
    } else{
      setupFound = false;
    }
  }
  catch(Exception e) {
     AppTrace.Error("Failed to read settings: {0}", e.Message);
     setupFound=false;
  }
    if(setupFound==false){
        Setting.Server = "192.168.1.100";
        Setting.Port = 1650;

        Setting.Device = 1;

        Setting.EncodingFromClient = "CP1252";
        Setting.EncodingToClient = "CP1252";

        Setting.FontCorrectionPixelsWidth = 0;
        Setting.FontCorrectionPixelsHeight = 0;

        Setting.XPct = 97.0f;
        Setting.YPct = 100.0f;
        Setting.SizePct = 98.0f;

        Setting.FullScreen = false;
        Setting.DontSleep = true;
        Setting.AutoSendEnter = true;

        try {
          //json
          var json = jsonConvert.SerializeObject(Setting);
          fileService.EnsureFolderExists("Setting");

          fileService.WriteFile(path, json);
        }
        catch (Exception e) {
          AppTrace.Error("Failed to save settings: {0}", e.Message);
        }
    }
}

}}

EN

回答 1

Stack Overflow用户

发布于 2014-01-15 05:25:04

我刚刚使用MvvmCross的3.1.1-beta2包在VS2012中创建了一个项目

然后我添加了File和Json插件包

我将核心FirstViewModel更改为:

代码语言:javascript
复制
public class FirstViewModel 
    : MvxViewModel
{
    private readonly IMvxFileStore _fileStore;
    private readonly IMvxJsonConverter _jsonConverter;
    private readonly string _filePath;

    public class ToStore
    {
        public string Foo { get; set; }
    }

    public ICommand SaveCommand
    {
        get
        {
            return new MvxCommand(() =>
                {
                    var toStore = new ToStore() {Foo = Hello};
                    var json = _jsonConverter.SerializeObject(toStore);
                    _fileStore.WriteFile(_filePath, json);   
                });
        }
    }

    public ICommand LoadCommand
    {
        get
        {
            return new MvxCommand(() =>
                {
                    string txt;
                    if (_fileStore.TryReadTextFile(_filePath, out txt))
                    {
                        Mvx.Trace("Loaded {0}", txt);
                        var stored = _jsonConverter.DeserializeObject<ToStore>(txt);
                        Hello = stored.Foo;
                    }
                });
        }
    }

    private string _hello = "Hello MvvmCross";

    public FirstViewModel(IMvxFileStore fileStore, IMvxJsonConverter jsonConverter)
    {
        _fileStore = fileStore;
        _jsonConverter = jsonConverter;
        _filePath = _fileStore.PathCombine("SubDir", "MyFile.txt");
        _fileStore.EnsureFolderExists("SubDir");
    }

    public string Hello
    { 
        get { return _hello; }
        set { _hello = value; RaisePropertyChanged(() => Hello); }
    }
}

我在一个测试Android UI中调用了这个:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
  <EditText
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="40dp"
    local:MvxBind="Text Hello"
    />
  <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="40dp"
    local:MvxBind="Text Hello"
    />
  <Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="40dp"
    android:text="Load"
    local:MvxBind="Click LoadCommand"
    />
  <Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="40dp"
    android:text="Save"
    local:MvxBind="Click SaveCommand"
    />
</LinearLayout>

这似乎工作得很好-它在测试运行期间和测试运行之间保存和加载了JSON。

基于此,我唯一的猜测是你是否在两次运行之间重新部署应用程序-如果你这样做了,并且你没有检查MonoDroid的Preserve application data/cache on device between deploys,那么你将看不到保留的设置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21094633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档