Mercurial > pub > Impl
comparison Lib/IMPL/Serialization.pm @ 49:16ada169ca75
migrating to the Eclipse IDE
author | wizard@linux-odin.local |
---|---|
date | Fri, 26 Feb 2010 10:49:21 +0300 |
parents | 03e58a454b20 |
children | b0c068da93ac |
comparison
equal
deleted
inserted
replaced
48:1c3c3e63a314 | 49:16ada169ca75 |
---|---|
1 | |
2 # 20060222 | |
3 # Модуль для сериализации структур данных | |
4 # (ц) Sourcer, cin.sourcer@gmail.com | |
5 # revision 3 (20090517) | |
6 | |
7 | |
8 package IMPL::Serialization; | 1 package IMPL::Serialization; |
9 use strict; | 2 use strict; |
3 | |
4 # 20060222 | |
5 # пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ | |
6 # (пїЅ) Sourcer, cin.sourcer@gmail.com | |
7 # revision 3 (20090517) | |
8 | |
10 | 9 |
11 package IMPL::Serialization::Context; | 10 package IMPL::Serialization::Context; |
12 use base qw(IMPL::Object); | 11 use base qw(IMPL::Object); |
13 | 12 |
14 use IMPL::Class::Property; | 13 use IMPL::Class::Property; |
15 use IMPL::Class::Property::Direct; | 14 use IMPL::Class::Property::Direct; |
16 use IMPL::Exception; | 15 use IMPL::Exception; |
17 use Scalar::Util qw(refaddr); | 16 use Scalar::Util qw(refaddr); |
18 | 17 |
19 BEGIN { | 18 BEGIN { |
20 private _direct property ObjectWriter => prop_all; # объект, записывающий данные в поток | 19 private _direct property ObjectWriter => prop_all; # пїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅ |
21 private _direct property Context => prop_all; # контекст (объекты которые уже сериализованы, их идентификаторы) | 20 private _direct property Context => prop_all; # пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ (пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ) |
22 private _direct property NextID => prop_all;# следующий идентификатор для объекта | 21 private _direct property NextID => prop_all;# пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ |
23 | 22 |
24 # процедура, которая знает, как сериализовывать определенные типы. Первым параметром | 23 # пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ. пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ |
25 # получаем ссылку на IMPL::Serialization::Context, вторым параметром ссылку на объект | 24 # пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ IMPL::Serialization::Context, пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ |
26 public _direct property Serializer => prop_all; | 25 public _direct property Serializer => prop_all; |
27 | 26 |
28 private _direct property State => prop_all; # состояние контекста сериализации | 27 private _direct property State => prop_all; # пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ |
29 } | 28 } |
30 | 29 |
31 # контекст закрыт, т.е. никакой объект не начат | 30 # пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ, пїЅ.пїЅ. пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅ |
32 sub STATE_CLOSED () { 0 } | 31 sub STATE_CLOSED () { 0 } |
33 # контекст открыт, т.е. объект начат, но в нем еще ничего не лежит | 32 # пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ, пїЅ.пїЅ. пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ, пїЅпїЅ пїЅ пїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅ |
34 sub STATE_OPENED () { 1 } | 33 sub STATE_OPENED () { 1 } |
35 # контекст открыт и в него могут быть добавлены только подобъекты | 34 # пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ |
36 sub STATE_COMPLEX () { 2 } | 35 sub STATE_COMPLEX () { 2 } |
37 # контекст открыт и в него уже ничего не может быть добавлено, там лежат данные | 36 # пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ |
38 sub STATE_DATA () { 3 } | 37 sub STATE_DATA () { 3 } |
39 | 38 |
40 sub CTOR { | 39 sub CTOR { |
41 my ($this,%args) = @_; | 40 my ($this,%args) = @_; |
42 | 41 |
53 my ($this,$sName,$Var) = @_; | 52 my ($this,$sName,$Var) = @_; |
54 | 53 |
55 die new Exception ('Invalid operation') if $this->{$State} == STATE_DATA; | 54 die new Exception ('Invalid operation') if $this->{$State} == STATE_DATA; |
56 | 55 |
57 if (not ref $Var) { | 56 if (not ref $Var) { |
58 # немного дублируется то, что снизу, но это ради того, чтобы объекты, которые идут | 57 # пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ, пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ, пїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ |
59 # не по ссылке, не получали идентификатора, им он не нужен | 58 # пїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅ пїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅ |
60 my $prevState = $this->{$State}; | 59 my $prevState = $this->{$State}; |
61 | 60 |
62 $this->{$ObjectWriter}->BeginObject(name => $sName);#, type => 'SCALAR'); | 61 $this->{$ObjectWriter}->BeginObject(name => $sName);#, type => 'SCALAR'); |
63 $this->{$State} = STATE_OPENED; | 62 $this->{$State} = STATE_OPENED; |
64 | 63 |
147 use IMPL::Class::Property; | 146 use IMPL::Class::Property; |
148 use IMPL::Class::Property::Direct; | 147 use IMPL::Class::Property::Direct; |
149 use IMPL::Exception; | 148 use IMPL::Exception; |
150 | 149 |
151 BEGIN { | 150 BEGIN { |
152 # уже десериализованные объекты, хеш, ключ - идентификатор, значение - ссылка. | 151 # пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅ, пїЅпїЅпїЅпїЅ - пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ - пїЅпїЅпїЅпїЅпїЅпїЅ. |
153 private _direct property Context => prop_all; | 152 private _direct property Context => prop_all; |
154 | 153 |
155 # текущий объект. информация для десериализации | 154 # пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ. пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ |
156 # { | 155 # { |
157 # Type => 'typename', | 156 # Type => 'typename', |
158 # Name => 'object_name', | 157 # Name => 'object_name', |
159 # Data => $Data, | 158 # Data => $Data, |
160 # Id => 'object_id' | 159 # Id => 'object_id' |
161 # } | 160 # } |
162 private _direct property CurrentObject => prop_all; | 161 private _direct property CurrentObject => prop_all; |
163 | 162 |
164 # стек объектов. сюда добавляются описания объектов по мере встречания новых объектов. | 163 # пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ. пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ. |
165 private _direct property ObjectsPath => prop_all; | 164 private _direct property ObjectsPath => prop_all; |
166 | 165 |
167 # сюда попадет корень графа объектов | 166 # пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ |
168 public _direct property Root => prop_get; | 167 public _direct property Root => prop_get; |
169 | 168 |
170 # создает объект и возвращает на него ссылку | 169 # пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ |
171 # ObjectFactory($Type,$DeserializationData,$refSurogate) | 170 # ObjectFactory($Type,$DeserializationData,$refSurogate) |
172 # $Type - имя типа данных | 171 # $Type - пїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ |
173 # $DeserializationData - либо ссылка на массив с данными для десериализации полей, | 172 # $DeserializationData - пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ, |
174 # либо скаляр содержащий данные. | 173 # пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ. |
175 # $refSurogate - ссылка на предварительно созданный, не инициализированный объект. | 174 # $refSurogate - пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ. |
176 # может принимать значение undef | 175 # пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ undef |
177 private _direct property ObjectFactory => prop_all; | 176 private _direct property ObjectFactory => prop_all; |
178 | 177 |
179 # Создает неинициализированные объекты. | 178 # пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ. |
180 # SurogateHelper($Type) | 179 # SurogateHelper($Type) |
181 # $Type имя типпа, чей сурогат нужно создать. | 180 # $Type пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ. |
182 private _direct property SurogateHelper => prop_all; | 181 private _direct property SurogateHelper => prop_all; |
183 } | 182 } |
184 | 183 |
185 sub CTOR { | 184 sub CTOR { |
186 my ($this,%args) = @_; | 185 my ($this,%args) = @_; |
206 push @{$rhCurrentObj->{'Data'}}, $name,$refObj; | 205 push @{$rhCurrentObj->{'Data'}}, $name,$refObj; |
207 } else { | 206 } else { |
208 $rhCurrentObj->{'Data'} = [$name,$refObj]; | 207 $rhCurrentObj->{'Data'} = [$name,$refObj]; |
209 } | 208 } |
210 | 209 |
211 # это затем, что будет вызван OnObjectEnd для объекта, который был простой ссылкой. т.о. мы не нарушим стек | 210 # пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ OnObjectEnd пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ. пїЅ.пїЅ. пїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ |
212 push @{$this->{$ObjectsPath}},$rhCurrentObj; | 211 push @{$this->{$ObjectsPath}},$rhCurrentObj; |
213 $this->{$CurrentObject} = undef; | 212 $this->{$CurrentObject} = undef; |
214 | 213 |
215 } else { | 214 } else { |
216 push @{$this->{$ObjectsPath}},$this->{$CurrentObject} if $this->{$CurrentObject}; | 215 push @{$this->{$ObjectsPath}},$this->{$CurrentObject} if $this->{$CurrentObject}; |
246 my ($this,$name) = @_; | 245 my ($this,$name) = @_; |
247 | 246 |
248 my $rhObject = $this->{$CurrentObject}; | 247 my $rhObject = $this->{$CurrentObject}; |
249 my $rhPrevObject = pop @{$this->{$ObjectsPath}}; | 248 my $rhPrevObject = pop @{$this->{$ObjectsPath}}; |
250 | 249 |
251 # если текущий объект не определен, а предыдущий - определен, значит текущий - это ссылка | 250 # пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ - пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ - пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ |
252 # просто восстанавливаем предыдущий в текущий и ничего более не делаем | 251 # пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ |
253 if ((not defined($rhObject)) && $rhPrevObject) { | 252 if ((not defined($rhObject)) && $rhPrevObject) { |
254 $this->{$CurrentObject} = $rhPrevObject; | 253 $this->{$CurrentObject} = $rhPrevObject; |
255 return 1; | 254 return 1; |
256 } | 255 } |
257 | 256 |