Как динамически обновить счетчик?

Сериализация предоставляет функции по умолчанию для хранения и последующего воссоздания объекта. Он использует подробный формат для определения всего графика объектов, которые нужно сохранить, например. предположим, что у вас есть связанныйList, и вы код, как показано ниже, то сериализация по умолчанию обнаружит все объекты, которые связаны и будут сериализованы. В сериализации по умолчанию объект полностью построен из его сохраненных битов без вызовов конструктора.

  ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream("/Users/Desktop/files/temp.txt"));
        oos.writeObject(linkedListHead); //writing head of linked list
        oos.close();

Но если вы хотите ограничить сериализацию или не хотите, чтобы часть вашего объекта была сериализована, используйте Externalizable , Интерфейс Externalizable расширяет интерфейс Serializable и добавляет два метода: writeExternal () и readExternal (). Они автоматически вызывается при сериализации или десериализации. Во время работы с Externalizable мы должны помнить, что конструктор по умолчанию должен быть открытым, иначе код будет генерировать исключение. Пожалуйста, следуйте приведенному ниже коду:

public class MyExternalizable implements Externalizable
{

private String userName;
private String passWord;
private Integer roll;

public MyExternalizable()
{

}

public MyExternalizable(String userName, String passWord, Integer roll)
{
    this.userName = userName;
    this.passWord = passWord;
    this.roll = roll;
}

@Override
public void writeExternal(ObjectOutput oo) throws IOException 
{
    oo.writeObject(userName);
    oo.writeObject(roll);
}

@Override
public void readExternal(ObjectInput oi) throws IOException, ClassNotFoundException 
{
    userName = (String)oi.readObject();
    roll = (Integer)oi.readObject();
}

public String toString()
{
    StringBuilder b = new StringBuilder();
    b.append("userName: ");
    b.append(userName);
    b.append("  passWord: ");
    b.append(passWord);
    b.append("  roll: ");
    b.append(roll);

    return b.toString();
}
public static void main(String[] args)
{
    try
    {
        MyExternalizable m  = new MyExternalizable("nikki", "student001", 20);
        System.out.println(m.toString());
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/Users/Desktop/files/temp1.txt"));
        oos.writeObject(m);
        oos.close();

        System.out.println("***********************************************************************");
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("/Users/Desktop/files/temp1.txt"));
        MyExternalizable mm = (MyExternalizable)ois.readObject();
        mm.toString();
        System.out.println(mm.toString());
    } 
    catch (ClassNotFoundException ex) 
    {
        Logger.getLogger(MyExternalizable.class.getName()).log(Level.SEVERE, null, ex);
    }
    catch(IOException ex)
    {
        Logger.getLogger(MyExternalizable.class.getName()).log(Level.SEVERE, null, ex);
    }
}
}

Здесь, если вы прокомментируете конструктор по умолчанию, тогда код выйдет за исключение:

 java.io.InvalidClassException: javaserialization.MyExternalizable;     
 javaserialization.MyExternalizable; no valid constructor.

Мы можем наблюдать, что пароль является конфиденциальной информацией , поэтому я не сериализую его в методе writeExternal (ObjectOutput oo) и не устанавливаю его значение в readExternal (ObjectInput oi). Это гибкость, предоставляемая Externalizable.

Вывод вышеуказанного кода приведен ниже:

userName: nikki  passWord: student001  roll: 20
***********************************************************************
userName: nikki  passWord: null  roll: 20

Мы можем наблюдать, поскольку мы не устанавливаем значение passWord так, чтобы оно было нулевым.

То же самое можно достичь, объявив поле пароля как переходное.

private transient String passWord;

Надеюсь, что это поможет. Прошу прощения, если я допустил ошибки. Спасибо.

23
задан Sufian 3 August 2016 в 11:30
поделиться

3 ответа

Фактически, вам нужно либо вызвать clear / add на адаптере, либо создать и установить новый адаптер. Адаптер не сохраняет ссылку на ваш список (он вызывает только toArray в вашем списке при создании), поэтому у него нет возможности обновить себя.

dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, newStringList);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerCategory.setAdapter(dataAdapter);
23
ответ дан 28 November 2019 в 18:02
поделиться

Есть ли опечатка или что-то в этом роде? В чем разница между dbAdapter и адаптером . Если Spinner уже имеет адаптер, вам не нужно его повторно назначать. Более того, единственное, что вам нужно сделать, это обновить адаптер и вызвать метод notifyDataSetChanged .

typeList = adapter.getList(); //array list with the values
// change the values, and then
adapter.notifyDataSetChanged();
4
ответ дан 28 November 2019 в 18:02
поделиться

Вы нужно только один раз вызвать setAdapter () и вызвать adapter.notifyDataSetChanged () для обновления данных.

13
ответ дан 28 November 2019 в 18:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: