Как использовать org.simpleframework.xml с локалью и календарем без исключения - PullRequest
0 голосов
/ 20 ноября 2018

У меня проблемы с org.simpleframework.xml.Serializer, Calendar и Locale.

Если языковой стандарт английский, США, календарь сохраняется как:

<dateManufature class="java.util.GregorianCalendar">2018-11-20 08:58:35.0 EST</dateManufature>

Когда языковым стандартом является испанский Мексика, календарь сохраняется как:

'<dateManufature class="java.util.GregorianCalendar">2018-11-20 08:41:27.9 GMT-05:00</dateManufature>'

Проблема заключается в том, что сначала файл сохраняется как локаль en_us, а затем, когда языковой стандарт изменяется на es_mx, а затем при чтении файла.является ошибкой исключения

'Unparseable date: "2018-11-20 08:58:35.0 EST"'

Удивительно, но когда en_us читает файл es_mx, исключения не возникает, и он просто конвертирует дату из GMT в EST, поэтому, возможно, у Serializer есть способ сохранить Календарь сВремя по Гринвичу в en_us?

Как получить org.simpleframework.xml.Serializer для чтения любой даты Календаря независимо от локали, в которой она была создана?

проект отмечен в https://github.com/amccombsahce/mySerializer

просто измените закомментированный код в функции updateBaseContextLocale, чтобы перейти с US на MX.

MainActivity.java

public class MainActivity extends AppCompatActivity
{

private Context _context;
private Locale _locale;
private String _filename;
private String _foldername;

public Cars _cars;

private TextView layout_textview_carcount;

@Override
protected void attachBaseContext(Context base)
{
    super.attachBaseContext(updateBaseContextLocale(base));
}
public Context updateBaseContextLocale(Context context)
{
    _locale = new Locale("es", "MX");
    //_locale = new Locale("en", "US");

    Configuration configuration = context.getResources().getConfiguration();
    configuration.setLocale(_locale);
    Locale.setDefault(_locale);
    _context = context.createConfigurationContext(configuration);
    return _context;
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ActivityCompat.requestPermissions(this, new String[] {
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE}, 1);

    layout_textview_carcount = findViewById(R.id.layout_textview_carcount);
    setTitle(getString(R.string.app_name));

    _foldername = String.format("%s/%s", Environment.getExternalStorageDirectory().getAbsolutePath(),
            _context.getString(R.string.app_name_folder));

    File folders = new File(_foldername);
    boolean b = folders.mkdirs();

    _filename = String.format("%s/%s",  _foldername, "cars.xml");


    _cars = new Cars(_context);

    readFile();

    layout_textview_carcount.setText(String.format(_locale, "%d", _cars.getSize()));

}

protected void buttonClick(View v)
{
    Car car = new Car();
    _cars.addCar(car);

    writeFile();

    layout_textview_carcount.setText(String.format(_locale, "%d", _cars.getSize()));
}
public boolean readFile()
{
    boolean bReturn = false;
    try
    {
        File file = new File(_filename);
        if (file.exists())
        {
            org.simpleframework.xml.Serializer serializerREAD = new Persister();
            serializerREAD.read(_cars, file);
            bReturn = true;
        }
    }
    catch (Exception ex)
    {
        String error = ex.getLocalizedMessage();

        int breakpoint = 1;

        // unparsable date
        if (ex.getMessage().contains("Unparseable date"))
        {

            File file = new File(_filename);
            file.delete();
        }

    }
    return bReturn;
}
public boolean writeFile()
{
    boolean bReturn = false;
    try
    {
        File file = new File(_filename);
        org.simpleframework.xml.Serializer serializer = new Persister();
        serializer.write(_cars, file);
        bReturn = true;
    }
    catch (Exception ex)
    {
        String error = ex.getLocalizedMessage();
    }
    return bReturn;
}

}

Car.java

@Root
public class Car implements java.io.Serializable
{
@Element
private int carID;
@Element(required=false)
private Calendar dateManufature;

private Car()
{

}
public Car(Context context)
{
    _context = context;

    Configuration configuration = _context.getResources().getConfiguration();
    Locale locale = null;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N)
    {
        locale = configuration.getLocales().get(0);
    }
    else
    {
        locale = context.getResources().getConfiguration().locale;
    }

    dateManufature = Calendar.getInstance(locale);
    java.util.Date date =  new java.util.Date();
    dateManufature.setTime(date);

}

public void setCarID(int value)
{
    carID = value;
}
}

Cars.java

@Root(name = "myserialzer")
public class Cars implements java.io.Serializable
{

private Context _context;

@ElementList(required=false, name="cars")
private ArrayList<Car> mycars = new ArrayList<>();

public Cars(Context context)
{
    _context = context;
}
public ArrayList<Car> getCars() { return mycars; }

public void addCar(Car car)
{
    car.setCarID(mycars.size() + 1);
    mycars.add(car);
}

public int getSize()
{
    return mycars.size();
}
}
...