@@ -187,24 +187,42 @@ public void BeginDeserializing()
187
187
188
188
private void InitBuffer ( )
189
189
{
190
- Package . Stream . Seek ( ExportTable . SerialOffset , SeekOrigin . Begin ) ;
190
+ InitBuffer ( Package . Stream ) ;
191
+ }
191
192
192
- //Console.WriteLine( "Init buffer for {0}", (string)this );
193
- var buffer = new byte [ ExportTable . SerialSize ] ;
194
- _Buffer = new UObjectRecordStream ( Package . Stream , buffer ) ;
195
- #if HUXLEY
196
- _Buffer . Decoder = Package . Stream . Decoder ;
193
+ private void InitBuffer ( UPackageStream stream )
194
+ {
195
+ long objectOffset = ExportTable . SerialOffset ;
196
+ int objectSize = ExportTable . SerialSize ;
197
197
198
- Package . Stream . Decoder = null ;
199
- #endif
200
- // Bypass the terrible and slow endian reverse call
201
- int read = Package . Stream . EndianAgnosticRead ( buffer , 0 , ExportTable . SerialSize ) ;
202
- #if HUXLEY
203
- Package . Stream . Decoder = _Buffer . Decoder ;
204
- #endif
205
- Contract . Assert ( ExportTable . SerialOffset + ExportTable . SerialSize <= Package . Stream . Length ,
206
- "Exceeded file's length" ) ;
207
- //Debug.Assert(read == ExportTable.SerialSize, $"Incomplete read; expected a total bytes of {ExportTable.SerialSize} but got {read}");
198
+ byte [ ] buffer = new byte [ objectSize ] ;
199
+ int byteCount ;
200
+
201
+ // Make an object stream with a decoder as the base stream.
202
+ if ( stream . Decoder != null )
203
+ {
204
+ var decoder = stream . Decoder ;
205
+ // Read without decoding, because the encryption may be affected by the read count. e.g. "Huxley"
206
+ stream . Decoder = null ;
207
+ // Bypass the terrible and slow endian reverse call
208
+ stream . Seek ( objectOffset , SeekOrigin . Begin ) ;
209
+ byteCount = stream . EndianAgnosticRead ( buffer , 0 , objectSize ) ;
210
+ stream . Decoder = decoder ;
211
+
212
+ var baseStream = new MemoryDecoderStream ( stream . Decoder , buffer , objectOffset ) ;
213
+ _Buffer = new UObjectRecordStream ( stream , baseStream ) ;
214
+ }
215
+ else
216
+ {
217
+ // Bypass the terrible and slow endian reverse call
218
+ stream . Seek ( objectOffset , SeekOrigin . Begin ) ;
219
+ byteCount = stream . EndianAgnosticRead ( buffer , 0 , objectSize ) ;
220
+
221
+ _Buffer = new UObjectRecordStream ( stream , buffer ) ;
222
+ }
223
+
224
+ Contract . Assert ( byteCount == objectSize ,
225
+ $ "Incomplete read; expected a total bytes of { objectSize } but got { byteCount } ") ;
208
226
}
209
227
210
228
internal void EnsureBuffer ( )
@@ -223,7 +241,7 @@ internal void MaybeDisposeBuffer()
223
241
if ( _Buffer == null || ( DeserializationState & ObjectState . Deserializing ) != 0 )
224
242
return ;
225
243
226
- _Buffer . DisposeBuffer ( ) ;
244
+ _Buffer . Dispose ( ) ;
227
245
_Buffer = null ;
228
246
//Console.WriteLine( "Disposed" );
229
247
}
0 commit comments