Использование рекурсивных структур и буферов протокола во время выполнения - PullRequest
0 голосов
/ 24 августа 2011

Я пытаюсь проверить рекурсивное определение буферов протокола (с использованием Java, но, вероятно, это не имеет значения). Я пытаюсь заполнить свое сообщение двумя уровнями глубины сообщений RootType "otherGreetings" (рекурсивная структура). Я не могу получить правильный синтаксис и не могу найти образцы. Я либо получаю переполнение стека, либо все мои сообщения попадают в один и тот же список "otherGreetings". Какие-нибудь мысли? Вот мое сообщение.

option java_outer_classname = "RootTypeProto";

message RootType{

  required string attribute1 = 1;
  optional string attribute2 = 2;
  optional string attribute3 = 3;
  required string attribute4 = 4;
  required string element1 = 5;
  optional string element2 = 6;
  repeated string element3 = 7;
  repeated string element4 = 8;
  required WorldType world = 9;
  optional WorldType alternateWorld = 10;
  repeated RootType otherGreetings = 11;
  repeated Bar foo = 12;

}
message WorldType{

required string attribute1 = 1;
repeated string element1 = 2;

}
message Bar{

required string element2 = 1;

}

1 Ответ

0 голосов
/ 03 февраля 2015

(ответ в вопросе редактирования. Преобразован в вики-ответ сообщества. См. Вопрос без ответов, но проблема решена в комментариях (или расширена в чате) )

ОП написал:

Обновление: написал простой пример, который решил мою проблему

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

@Test
public void testWritingReadingProto() throws Exception {

// Build complex obj WorldType
proto.gen.RootTypeProto.WorldType.Builder worldBuilder = proto.gen.RootTypeProto.WorldType
    .newBuilder();
worldBuilder.setAttribute1("world-attr1");
worldBuilder.addElement1("world-elem1a");
worldBuilder.addElement1("world-elem1b");

// Build complex obj RootType (level 2)
proto.gen.RootTypeProto.RootType.Builder rootLevel2 = proto.gen.RootTypeProto.RootType
    .newBuilder();
rootLevel2.setAttribute1("level2-attr1");
rootLevel2.setAttribute2("level2-attr2");
rootLevel2.setAttribute3("level2-attr3");
rootLevel2.setAttribute4("level2-attr4");
rootLevel2.setElement1("level2-elem1");
rootLevel2.setElement2("level2-elem2");
rootLevel2.setWorld(worldBuilder);

// Build complex obj RootType (level 1)
proto.gen.RootTypeProto.RootType.Builder rootLevel1 = proto.gen.RootTypeProto.RootType
    .newBuilder();
rootLevel1.setAttribute1("level1-attr1");
rootLevel1.setAttribute2("level1-attr2");
rootLevel1.setAttribute3("level1-attr3");
rootLevel1.setAttribute4("level1-attr4");
rootLevel1.setElement1("level1-elem1");
rootLevel1.setElement2("level1-elem2");
rootLevel1.setWorld(worldBuilder);
rootLevel1.addOtherGreetings(rootLevel2);

// Build complex msg WorldType
proto.gen.RootTypeProto.RootType.Builder rootBuilder = proto.gen.RootTypeProto.RootType
    .newBuilder();
rootBuilder.setAttribute1("attr1");
rootBuilder.setAttribute2("attr2");
rootBuilder.setAttribute3("attr3");
rootBuilder.setAttribute4("attr4");
rootBuilder.setElement1("elem1");
rootBuilder.setElement2("elem2");
// Add complex
rootBuilder.setWorld(worldBuilder);
rootBuilder.addOtherGreetings(rootLevel1);

// Build structure for output
proto.gen.RootTypeProto.RootType root = rootBuilder.build();

// Confirm structure
Assert.assertEquals("attr1", root.getAttribute1());
Assert.assertEquals("attr2", root.getAttribute2());
Assert.assertEquals("attr3", root.getAttribute3());
Assert.assertEquals("attr4", root.getAttribute4());
Assert.assertEquals("world-attr1", root.getWorld().getAttribute1());
Assert.assertEquals(2, root.getWorld().getElement1Count());
Assert.assertEquals("world-elem1a", root.getWorld().getElement1List()
    .get(0));
Assert.assertEquals("world-elem1b", root.getWorld().getElement1List()
    .get(1));
Assert.assertEquals(1, root.getOtherGreetingsCount());
Assert.assertEquals("level1-attr1", root.getOtherGreetingsList().get(0)
    .getAttribute1());
Assert.assertEquals(1, root.getOtherGreetingsList().get(0)
    .getOtherGreetingsCount());
Assert.assertEquals("level2-attr1", root.getOtherGreetingsList().get(0)
    .getOtherGreetingsList().get(0).getAttribute1());

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...