Семантика ссылок в буферах протокола Google - PullRequest
1 голос
/ 19 мая 2011

У меня есть немного необычная программа, которая работает со случаями, очень похожими на это (в C # -подобном псевдокоде):

class CDataSet
{
   int m_nID;
   string m_sTag;
   float m_fValue;
   void PrintData()
   {
      //Blah Blah
   }
};

class CDataItem
{
  int m_nID;
  string m_sTag;
  CDataSet m_refData;
  CDataSet m_refParent;
  void Print()
  {
      if(null == m_refData)
       {
         m_refParent.PrintData();
       }
     else
       {
         m_refData.PrintData();
       }
  }
};

Члены m_refData и m_refParent инициализируются нулем и используются следующим образом: m_refData ->Используется при добавлении нового набора данных. M_refParent -> Используется для указания на существующий набор данных.Новый набор данных добавляется только в том случае, если поле m_nID не совпадает с существующим.

В настоящее время этот код управляет примерно 500 объектами с примерно 21 полем на объект, и формат выбора на данный момент - XML,который на 100k + линий и 5MB + очень громоздкий.

Я планирую изменить весь shebang для использования ProtoBuf, но в настоящее время я не уверен, как справиться с семантикой ссылок.Любые мысли будут высоко ценится

1 Ответ

1 голос
/ 19 мая 2011

Из коробки буферы протокола не имеют никакой ссылочной семантики.Вам нужно будет сделать перекрестную ссылку на них вручную, обычно используя искусственный ключ.По сути, на уровне DTO вы бы использовали ключ для CDataSet (который вы просто придумываете, возможно, просто увеличивающееся целое число), сохраняя ключ вместо элемента в m_refData / m_refParent и выполняя исправление вручную во время сериализации / десериализации.Вы также можете просто сохранить индекс в наборе CDataSet, но это может усложнить вставку и т. Д.Вам решать;так как это сериализация, вы можете утверждать, что вы не будете вставлять (и т. д.) за пределы первоначальной совокупности, и, следовательно, необработанный индекс в порядке и надежен.

Это, однако, очень распространенный сценарий - так что в качестве функции, специфичной для реализации, я добавил необязательное (opt-in) отслеживание ссылок в мою реализацию (protobuf-net), которое, по сути, автоматизирует вышеуказанное вобложки (поэтому вам не нужно менять свои объекты или открывать ключ вне двоичного потока).

...