Сериализаторы обычно требуют, чтобы объекты имели конструкторы по умолчанию.
Добавьте конструктор по умолчанию в Lecture и посмотрите, что произойдет.
Я не убежден, что мерзавец является действительно инструментом для Вашего задания. мерзавец является распределенным инструментом управления исходным кодом, не инструментом репликации баз данных.
Единственное автоматическое слияние, которого будет делать попытку мерзавец, объединяется текстовых файлов. Файл журнала является (обычно) текстовым файлом, итак, почему бы не поместить это непосредственно в мерзавца и не в базу данных сначала?
Я сомневаюсь, что любая универсальная система управления версиями (мерзавец, svn, cvs, и т.д.) может обработать базу данных в способах, которыми Вы описали. Если Вы настаиваете на том, чтобы использовать мерзавца для слияния баз данных, Ваш лучший выбор состоит в том, чтобы преобразовать базу данных в текстовый файл, объединить текстовый файл и воссоздать базу данных. Например,
sqlite3 .dump > dump_file.txt
может создать все sql операторы, необходимые для переделывания базы данных, затем Вы действительно наполняете в выведенный файл, затем делаете sqlite базу данных с
sqlite3 newdatabase.db < modified_dump_file.txt
Необходимо смочь автоматизировать это использование своего рода рычага мерзавца (я не слишком знаком с мерзавцем).
Нет никакого способа объединить двоичные файлы правильно это в общем случае, таким образом, мерзавец не может и не делать этого.
С некоторым усилием Вы могли использовать мерзавца для управления версиями дампов базы данных, но за исключением очень простых случаев необходимо будет сделать больше, чем просто использование прямо выводит. Необходимо будет думать о том, как выведенные строки отсортированы на основе столбцов ключа по крайней мере. Еще Вы получите побочные конфликты или слияния, которые производят синтаксически допустимые дампы, представляющие базу данных мусора.
F.ex., если различные версии строки с тем же настраивают шоу в различных регионах строки различных версий дампа, мерзавец мог бы думать, что это разумный сохранило их обоих. Получающийся дамп имел бы два представления той же строки, которая не имеет смысла.
Короче говоря, Вы, вероятно, будете несчастной попыткой сохранить имеющее версию использование базы данных системы управления исходным кодом.
Вам необходимо определить пользовательские драйверы слияния и сравнения в вашей конфигурации git, а затем использовать атрибуты, чтобы связать их с файлами.
Это просто слияние текста на дампах, так что это вполне может привести к полному вздору. Вам обязательно нужно будет проверить его работу, чтобы убедиться, что он все сделал правильно Тем не менее, это должно избавить от утомления от простых слияний.
В вашем .git / config:
[merge "sqlite3"]
name = sqlite3 merge driver
driver = merge-sqlite3 %O %A %B
[diff "sqlite3"]
name = sqlite3 diff driver
command = diff-sqlite3
в .gitattributes:
signons.sqlite diff=sqlite3 merge=sqlite3
И где-то на вашем пути с именем diff-sqlite3
#!/usr/bin/perl -w
use File::Temp qw/ :POSIX /;
use IPC::Run qw/run/ ;
@ARGV == 7 or die sprintf 'wtf %s', join(' ', @ARGV);
my ($name, $x, $y) = ($ARGV[0], $ARGV[1], $ARGV[4]);
my ($a, $b);
eval {
$a = tmpnam();
$b = tmpnam();
run ['sqlite3', $x, '.dump'], '>', $a or die 'sqlite3 failed';
run ['sqlite3', $y, '.dump'], '>', $b or die 'sqlite3 failed';
print "diff-sqlite3 a/$name b/$name\n";
run ['diff', '-u', $a, $b, '--label', "a/$name", '--label', "b/$name"], '>', \*STDOUT;
unlink $a;
unlink $b;
1;
} or do {
unlink $a if defined $a;
unlink $b if defined $b;
die $@;
}
также на вашем пути с именем merge-sqlite3
#!/usr/bin/perl -w
use File::Temp qw/ :POSIX /;
use IPC::Run qw/run/ ;
@ARGV == 3 or die sprintf 'wtf %s', join(' ', @ARGV);
my ($o, $a, $b) = @ARGV;
print "MERGEING SQLITE FILES $o $a $b\n";
eval {
$ad = tmpnam();
$bd = tmpnam();
$od = tmpnam();
run ['sqlite3', $o, '.dump'], '>', $od or die 'sqlite3 failed';
run ['sqlite3', $a, '.dump'], '>', $ad or die 'sqlite3 failed';
run ['sqlite3', $b, '.dump'], '>', $bd or die 'sqlite3 failed';
run ['merge', $ad, $od, $bd] or do {
my $newname = "$a.dump";
my $n = 0;
while (-e $newname) {
++$n;
$newname = "$a.dump.$n";
}
print "merge failed, saving dump in $newname\n";
rename $ad, $newname;
undef $ad;
die 'merge failed';
};
unlink $a or die $!;
my $err;
run ['sqlite3', $a], '>', \*STDOUT, '2>', \$err, '<', $ad;
if ('' ne $err) {
print STDERR $err;
die 'sqlite3 failed';
}
unlink $ad if defined $ad;
unlink $bd;
unlink $od;
1;
} or do {
unlink $ad if defined $ad;
unlink $bd if defined $bd;
unlink $od if defined $od;
die $@;
}
Я только что взломал их прямо сейчас, так что вам, возможно, придется сгладить изгибы.
см .: http://git-scm.com/docs/gitattributes и http://git-scm.com/docs/git-config