Xstream прекращает запись в файл, когда не закончена

Я написал некоторый код для генерации паролей для пользователей, которые ранее были написаны для sql. Затем я хотел записать каждого пользователя с именем пользователя и паролем в xml. Код, кажется, работает нормально, за исключением того, что около 200-го пользователя он внезапно останавливается на полпути через тег xml и заканчивается, что довольно странно. Я использую Xstream в качестве своей библиотеки. В Arraylist около 215 пользователей.

Пробовал StaxDriver и DomDriver. Результат Stax Driver был таким же, как у пустого конструктора Xstream, но Dom был еще хуже.

        XStream xstream = new XStream();
        xstream.alias("Zakaznici", ListZakazniku.class);

        try {
            PrintWriter out = new PrintWriter("Zakaznici.xml");
            out.write(xstream.toXML(ListZakazniku.zakaznici));
        }catch (Exception e){
            e.printStackTrace();
        }
public class ListZakazniku {
    public static ArrayList<Zakaznik> zakaznici = new ArrayList<>();

    public ListZakazniku(){
        zakaznici= new ArrayList<Zakaznik>();
    }

    public void setZakaznici(ArrayList<Zakaznik> zakaznik){
        this.zakaznici.clear();
        this.zakaznici = zakaznik;
    }

    public static ArrayList<Zakaznik> getZakaznici() {
        return zakaznici;
    }

    public void add(Zakaznik elbow){
        zakaznici.add(elbow);
    }

а Заказник - это довольно простой объект с именем пользователя, паролем, идентификатором ....

порез был такой

</Zakaznik>
<Zaka

Я не знаю, что с этим не так. Жду любых предложений :)

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш список не должен быть статичным, также немного изменен ваш код печати. Такой подход будет работать нормально:

@XStreamAlias("listZakazniku")
public class ListZakazniku {

    private List<Zakaznik> zakaznicis;

    public ListZakazniku() {
        zakaznicis = new ArrayList<Zakaznik>();
    }

    public void add(Zakaznik user) {
        zakaznicis.add(user);
    }


    @XStreamAlias("zakaznik")
    private static class Zakaznik {
        private String user;
        private String pwd;
        public Zakaznik(String user, String pwd) {
            this.user = user;
            this.pwd = pwd;
        }
    }


    public static void main(String[] args){
        XStream xstream = new XStream();
        xstream.processAnnotations(ListZakazniku.class);
        ListZakazniku ll = new ListZakazniku();
        ll.add(new Zakaznik("user1", "pwd1"));
        ll.add(new Zakaznik("user2", "pwd2"));
        try {
            try (PrintWriter out = new PrintWriter("Zakaznici.xml")) {
                out.println(xstream.toXML(ll));
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

Выход:

<listZakazniku>
  <zakaznicis>
    <zakaznik>
      <user>user1</user>
      <pwd>pwd1</pwd>
    </zakaznik>
    <zakaznik>
      <user>user2</user>
      <pwd>pwd2</pwd>
    </zakaznik>
  </zakaznicis>
</listZakazniku>

Не забудьте вызов processAnnotations для каждого аннотированного класса! (Кроме того, ваш заказник не является внутренним статическим классом, я думаю, как и в моем примере выше, это было просто для того, чтобы втиснуть полный код..)

Большое спасибо, это действительно помогло мне :)

stepankon 08.07.2019 11:08

Другие вопросы по теме