@@ -15,40 +15,53 @@ public class PbTickSerializer
15
15
{
16
16
private V1 . PbTickSerializer v1Reader = new V1 . PbTickSerializer ( ) ;
17
17
private V2 . PbTickSerializer v2Reader = new V2 . PbTickSerializer ( ) ;
18
- private bool bV2 = true ;
19
-
20
- //public PbTickCodec Codec = new PbTickCodec();
21
-
18
+ private int nVersion = 2 ;
19
+ private int nMaxVersion = 2 ;
20
+
22
21
public V2 . PbTick ReadOne ( Stream stream )
23
22
{
23
+ // 计划如果简单的将V2和V1的文件合并成一个文件也能读取
24
24
long Position = stream . Position ;
25
25
V2 . PbTick tick = null ;
26
26
27
- try
27
+ bool bFisrtException = true ;
28
+
29
+ do
28
30
{
29
- if ( bV2 )
31
+ try
30
32
{
31
- tick = v2Reader . ReadOne ( stream ) ;
33
+ switch ( nVersion )
34
+ {
35
+ case 1 :
36
+ tick = V1_to_V2 . Converter ( v1Reader . ReadOne ( stream ) ) ;
37
+ break ;
38
+ case 2 :
39
+ tick = v2Reader . ReadOne ( stream ) ;
40
+ break ;
41
+ default :
42
+ throw new Exception ( string . Format ( "Invalid file, version {0}" , nVersion ) ) ;
43
+ }
44
+ return tick ;
32
45
}
33
- else
46
+ catch ( ProtobufDataZeroException ex )
34
47
{
35
- V1 . PbTick tmp = v1Reader . ReadOne ( stream ) ;
36
- if ( tmp == null )
37
- return null ;
38
- tick = V1_to_V2 . Converter ( tmp ) ;
48
+ bFisrtException = false ;
49
+ nVersion = ex . CurrentVersion ;
50
+ stream . Seek ( Position , SeekOrigin . Begin ) ;
39
51
}
40
- }
41
- catch
42
- {
43
- bV2 = false ;
44
- stream . Seek ( Position , SeekOrigin . Begin ) ;
45
- V1 . PbTick tmp = v1Reader . ReadOne ( stream ) ;
46
- if ( tmp == null )
47
- return null ;
48
- tick = V1_to_V2 . Converter ( tmp ) ;
49
- }
52
+ catch ( ProtoException ex )
53
+ {
54
+ // 第一次出现问题后,从最新格式开始向后进行解析
55
+ if ( bFisrtException )
56
+ nVersion = nMaxVersion ;
57
+ else
58
+ -- nVersion ;
59
+
60
+ bFisrtException = false ;
61
+ stream . Seek ( Position , SeekOrigin . Begin ) ;
62
+ }
63
+ } while ( true ) ;
50
64
51
- //Codec.Config = tick.Config;
52
65
return tick ;
53
66
}
54
67
0 commit comments