LINUX.ORG.RU

DSL для сохранения java-объектов


0

1

Был написан DSL для сохранения жаба объектов в текстовый формат, и восстановления их из него. На сферических JavaBean он работает отлично. Но вот досада например при сохранении java.util.Date() и некоторых других кривых объектов оно косячит. Как поступить? Пытаться определять deprecated properties или разрабатывать систему костылей и подпорок или есть третий путь?

Вот пример возможностей:

 @Test
  public void singlesTest() {
    System.out.println("parse singles");
    ArrayList<Integer> al = new ArrayList<Integer>();
    al.add(1);
    Pair singles[] = new Pair[]{
      new Pair("true", true),
      new Pair("false", false),
      new Pair("null", null),
      new Pair("'null'", "null"),
      new Pair("1", 1),
      new Pair("[1]", al),
      new Pair("1.4", 1.4f),
      new Pair("1.4e4", 1.4e4f),
      new Pair("-1.4e4", -1.4e4f),
      new Pair("{}", new HashMap<Object, Object>()),
      new Pair("java.awt.Dimension{}", new Dimension()),
      new Pair("java.awt.Dimension[]", new Dimension()),
      new Pair("java.awt.Dimension[]{}", new Dimension()),
      new Pair("[]", new ArrayList<Object>())
    };
    for(Pair p: singles) {
      System.out.println("Parse: " + p.s);
      Object res = JDL.read(p.s);
      System.out.println("\t res: " + res 
        + " (" + (res==null?null:res.getClass()) + ")");
      assertEquals(p.o, res);
    }
  }

  /**
   * Test of read method, of class JDL.
   */
  @Test
  public void simpleTestParse() {
    System.out.println("parse");
    String src = "{\n" +
      "'set':{'\\'d':1, 'c':'ddas\\'da'},\n" +
      "'key':[\n" +
      "  java.awt.Dimension[10, 330],\n" +
      "  java.awt.Dimension{width:20, height:160},\n" +
      "  java.awt.Dimension{width:30, height:80},\n" +
      "  java.awt.Dimension{width:40, height:40},\n" +
      "  java.awt.Dimension{width:50, height:20},\n" +
      "  java.awt.Rectangle{x:-23, y: 34, width:50, height:20}],\n" +
      "'set1':{'\\'d':1, 'c':'ddas\\'da'},\n" +
      "'key1':[\n" +
      "  java.awt.Dimension[10, 330],\n" +
      "  java.awt.Dimension{width:20, height:160},\n" +
      "  java.awt.Dimension{width:30, height:80},\n" +
      "  java.awt.Dimension{width:40, height:40},\n" +
      "  java.awt.Dimension{width:50, height:20},\n" +
      "  java.awt.Rectangle{x:-23, y: 34, width:50, height:20}]\n" +
      "}\n";
    Map<Object, Object> o = new HashMap<Object, Object>();
    o.put("check", new Integer(14));
    JDL.read(src, o);
    HashMap<Object, Object> orig = new HashMap<Object, Object>();
    orig.put("check", new Integer(14));
    HashMap<Object, Object> subMap = new HashMap<Object, Object>();
    subMap.put("'d", 1);
    subMap.put("c", "ddas'da");
    ArrayList<Object> subList = new ArrayList<Object>();
    subList.add(new Dimension(10, 330));
    subList.add(new Dimension(20, 160));
    subList.add(new Dimension(30, 80));
    subList.add(new Dimension(40, 40));
    subList.add(new Dimension(50, 20));
    subList.add(new Rectangle(-23, 34, 50, 20));
    orig.put("set", subMap);
    orig.put("set1", subMap);
    orig.put("key", subList);
    orig.put("key1", subList);
    assertEquals(orig, o);
  }

  @Test
  public void objectCreationTestParse() {
    System.out.println("parseAndCreate");
    String src = "javax.swing.JButton{" +
      "  preferredSize:java.awt.Dimension{" +
      "    width:10,height:100" +
      "  }," +
      "  text:\"some button\",\n" +
      "  visible:true" +
      "}";
    JButton b = JDL.read(src);
    assertEquals(new Dimension(10,100), b.getPreferredSize());
    assertEquals("some button", b.getText());
  }

  @Test
  public void writeTest() {
    System.out.println("read & write");
    HashMap<Object, Object> orig = new HashMap<Object, Object>();
    HashMap<Object, Object> subMap = new HashMap<Object, Object>();
    Dimension d = new Dimension(200, -39);
    T t = new T();
    t.thiz = t;
    t.aaa = d;
    subMap.put(3, t);
    ArrayList<Object> subList = new ArrayList<Object>();
    subList.add(new Dimension(10, 330));
    subList.add(t);
    subList.add(new Empty());
    subMap.put(34.5e35f, subList);
    subMap.put("\u0000", t);
    orig.put("aa", subMap);
    orig.put("z'", d);
    orig.put("rel", subList);
    StringBuilder sb = new StringBuilder();
    JDL.write(orig, sb);
    System.out.println(sb);
    Object res = JDL.read(sb);
    assertEquals(orig, res);
  }

Эта хрень используется для сохранения настроек (чтобы в ручную не ковырятся с каждым сложным объектов), для конфигов, для декларативного описания фильтров:

or[
  gt[$s, 1],
  and[
    eq[$f, $s],
    not[eq[$f, null]]
  ]
]

И еще для многих «штучек», потому кабы допилить его очень надо.

★★☆

Ответ на: комментарий от ma1uta

сравни размер приведеного сериализованного кода и того гэ что выдаcт jaxb. Я понимаю что наклепать и забыть jaxb рулезен, но сабж для правки кода руками.

wfrr ★★☆
() автор топика

чем json-lib не нравится?

одно но:

досада например при сохранении java.util.Date() и некоторых других кривых объектов оно косячит.

не без этого, надо допиливать.

Rastafarra ★★★★
()
Ответ на: комментарий от Rastafarra

хотя java.util.Date оно сериализует нормально, косячит оно в других местах.

например помню какая-то фигня была с long и int. если из строки цифра в int лезет (не смотря на то, что у тебя заявлен long), то жаба ругнется и long надо получить более другими методами.

Rastafarra ★★★★
()
Ответ на: комментарий от Rastafarra

чем json-lib не нравится?

Там есть ссылки или возможность вызова конструктора объектов? А указание типа объектов в json есть?

ps. можно не отвечать 8)

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

> Там есть ссылки или возможность вызова конструктора объектов?

ссылки? в твоем сериализаторе есть такая фича? что-то я себе не очень хорошо представляю как это выглядит в тексте. покажешь пример?

указание типа объектов в json

это не фича json, это фича жабских классов и сосатора. то, что засосать без костылей некоторые вещи не получается — да, имхо бага, надо чинить. в остальном... имхо ты ваяешь еще один бажный и недоделанный лисп ;)

Rastafarra ★★★★
()
Ответ на: комментарий от wfrr

сравни размер приведеного сериализованного кода и того гэ что выдаcт jaxb.

Не аргумент. О размере xml уже давно обсуждали. Use, xml+zip, Luke

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Не аргумент.

Только при энтерпрайзе головного моска.

О размере xml уже давно обсуждали. Use, xml+zip, Luke

Ога, сначала раздуть до пердела, а потом сжимать, цивилизация помрет от идиотизма.

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

ты неправ. Поддерживаю vertexua полностью. XML - де-факто стардарт и более того, стандарт работающий, обеспечивающий помимо хранения еще трнаспортировку данных (в том числе между языками и платформами) и валидацию по xsd. Валидацию, кстати, json не умеет.

JFreeM ★★★☆
()
Ответ на: комментарий от wfrr

а, да, кстати, xml не оверхед ни разу - делайте все атрибутами. Но даже если не сделать так, оверхед заключается лишь в дублировании информации в закрывающем теге. Имхо, это немного.

JFreeM ★★★☆
()
Ответ на: комментарий от JFreeM

ты неправ. Поддерживаю vertexua полностью. XML - де-факто стардарт и более того, стандарт работающий, обеспечивающий помимо хранения еще трнаспортировку данных (в том числе между языками и платформами) и валидацию по xsd. Валидацию, кстати, json не умеет.

Уважаемый, вы щас выдали туеву хучу маркетиногового бреда. Особенно смешон задвиг про «это стандарт, поэтому вы это обязаны юзать», это аргумент для безмозглых члестов, милок.

А еще валидация мне ненужна, ибо она выполняется структурой классов Java (приколись да?), хотя, конечно я сомневаюсь, что ты это сообразил.

Итак уважаемый, фаны-хмл у вас какиенить _разумные_ аргументы?

wfrr ★★☆
() автор топика
Ответ на: комментарий от JFreeM

а, да, кстати, xml не оверхед ни разу - делайте все атрибутами. Но даже если не сделать так, оверхед заключается лишь в дублировании информации в закрывающем теге. Имхо, это немного.

{java.awt.Dimension{width:20,height:100}}

//xml

<!DOCTYPE blah blah>
<root>
  <map>
    <element typeName="java.awt.Dimension">
      <field name="width">
        <int>20</int>
      </field>
      <field name="height">
        <int>100</int>
      </field>
    </element>
  </map>
</root>

Так чо не метанируй.

wfrr ★★☆
() автор топика
Ответ на: комментарий от vertexua

Чето у xml-фанов аргументация скисла.

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

Уважаемый, вы щас выдали туеву хучу маркетиногового бреда.

После этого предложения надо добавлять «f*ck the corporate world, byatch!» или «make love, not war» )

И кстати да

это стандарт, поэтому вы это обязаны юзать

vertexua ★★★★★
()
Ответ на: комментарий от wfrr

нет, не приколюсь. Потому что рефлексию надо избегать везде, где без нее можно обойтись. А валидировать ваши данные можно только с помощью рефлексии.

JFreeM ★★★☆
()
Ответ на: комментарий от vertexua

1 короче не вышло (короче DSL, так шо не мухлюй)

2 Map ты не указал, бо память у тебя плохая, или шланг ты великий

3 за такой xml тя убъют те кто будет писать к нему читалку ибо поля могут иметь значения не примитивного типа, тогда придется обрабатывать «особые» случаи, и xml будет раздут

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

Ты все еще будешь доказывать мне что белое это черное?

wfrr ★★☆
() автор топика
Ответ на: комментарий от vertexua

А какже стандарты де-факто? 8)

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

3 за такой xml тя убъют те кто будет писать к нему читалку ибо поля могут иметь значения не примитивного типа, тогда придется обрабатывать «особые» случаи, и xml будет раздут

ты не поверишь... Рассказываю: вначале была xsd и это было хорошо. Потом из xsd сгенерились джава классы. После этого сериализация и десериализация проходят в одну строку

JaxbMarshaller.marshal JaxbMarshaller.unmarshal

Никто же не отдает xml без xsd, а если есть xsd, то есть и классы и парсер писать вручную для xml никто не будет.

JFreeM ★★★☆
()
Ответ на: комментарий от JFreeM

java-классы были написаны сотрудниками Sun

ты не поверишь 8) И некоторые не изменялись с 1999 года.

Не, конечно идиоты могут нагенерить xsd и врапперов к каждому классу который я подумаю сохранить, но у них же диагноз... им можно 8)

wfrr ★★☆
() автор топика
Ответ на: комментарий от JFreeM

Чо ты всего две лабы написал? Я тебя тогда разочарую - можешь не кичится, если человек не идиот то мне пофиг что он пишет, может книги воще.

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

Какой еще map? Ты вообще о чем? Я указал аналог того, что написано у тебя. Хочешь чтобы не было атрибутов, ок, можно без них. Будет чуть больше.

Очень круто, твой костыль на несколько байтов меньше, но ты гробил время для того, чтобы его написать. Твой формат нестандартный, локальный, неописанный ни в каких доках, сторонних парсеров нет. Ну и баги потом еще вылезут.

Кстати нефиг кичиться что места меньше. Любой текст в этом не торт. Но если у тебе нужно в текстовом редакторе и есть баттхерт по xml, то man yaml и перестань плодить велосипеды. Поддерживает ссылки.

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Вообще если убрать «минус пару байтов» головного мозга, то вам подойдет Simple. Это xml. Отличие от JAXB - контроль за тем xml, который генерируется. Вы просто размечаете аннотациями как хранить.

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Какой еще map? Ты вообще о чем? Я указал аналог того, что написано у тебя. Хочешь чтобы не было атрибутов, ок, можно без них. Будет чуть больше.

Если со зрением пендец, то юзай поиск по странице.

Очень круто, твой костыль на несколько байтов меньше,

Не требует 10мб библиотек, сотни конфигов, и тысячи часов изучения xsd

но ты гробил время для того, чтобы его написать.

Полдня? Ты на лоре больше сидишь детко.

Твой формат нестандартный, локальный, неописанный ни в каких доках, сторонних парсеров нет.

В отличии от...XML, а синтаксис там по сложности сравним с лиспом 8) и нтуитивен, так что все твои предежи напрасны.

Ну и баги потом еще вылезут.

Не суди по себе 8)

wfrr ★★☆
() автор топика
Ответ на: комментарий от vertexua

Кстати нефиг кичиться что места меньше. Любой текст в этом не торт. Но если у тебе нужно в текстовом редакторе и есть баттхерт по xml, то man yaml и перестань плодить велосипеды. Поддерживает ссылки.

Ты помоему совсем лишен не только зрения но и моска, я раз пять повторил что это редактируется вручную (я думаю ты робат), и юзается как подформат в Properties и не только.

Вообще если убрать «минус пару байтов» головного мозга, то вам подойдет Simple. Это xml. Отличие от JAXB - контроль за тем xml, который генерируется. Вы просто размечаете аннотациями как хранить.

Ты упоролся своим xml.

wfrr ★★☆
() автор топика
Ответ на: комментарий от vertexua

{} - map

[] - list

java.lang.Object{} - объект

Но и это ты мог бы определить сам, для этого даже не потребуется ни мозг ни фантазия.

Итак, что там с сериализацией произвольный объектов? Любых, без предварительной генерации тонн всякого говно xml и навешивания аннотаций на стандартные классы jdk?

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

>тысячи часов изучения xsd
мне хватило трех часов

сотни конфигов

один кусочек помки для генерации классов. ~20 строк.

Не требует 10мб библиотек

Вам места на диске жалко?

JFreeM ★★★☆
()
Ответ на: комментарий от JFreeM

ты готов убиться ап стену, проигнорировать все разумные доводы лишь бы получить оргазм с xml, это диагноз.

wfrr ★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.