public void Deserialize(BinaryStream input) { Name = input.ReadInt32(); StringCount = input.ReadInt32(); for (int i = 0; i < StringCount; i++) { var locStr = new OasisLocalizedString(); locStr.Deserialize(input, Name); LocalizedStrings.Add(locStr); } CompressedValuesSectionsCount = input.ReadInt32(); for (int i = 0; i < CompressedValuesSectionsCount; i++) { var cpr = new CompressedValues(); cpr.Deserialize(input); var lz = new LZ4Decompressor64(); var buf = new byte[cpr.DecompressedSize]; lz.DecompressKnownSize(cpr.CompressedBytes, buf, cpr.DecompressedSize); var dCpr = new DecompressedValues(); using (var bs = new BinaryStream(buf)) dCpr.Deserialize(bs); foreach (var kv in dCpr.IdValuePairs) { var id = kv.Key; var value = kv.Value; OasisStringLookup.SetString(id, value); } } }
public void Serialize(BinaryStream output) { output.Write(Name.Hash); output.Write(StringCount); foreach (var locStr in LocalizedStrings) { locStr.Serialize(output); } var vals = new List <DecompressedValues>(); var locStrs = new List <OasisLocalizedString>(); var len = 0; var crc = 0; foreach (var locStr in LocalizedStrings) { locStrs.Add(locStr); len += (locStr.Value.Length * 2); if ((len >= MAX_LENGTH) && (locStr.Enum != crc)) { var val = new DecompressedValues(locStrs); vals.Add(val); locStrs = new List <OasisLocalizedString>(); len = 0; crc = 0; } else { crc = locStr.Enum; } } if (locStrs.Count != 0) { var val = new DecompressedValues(locStrs); vals.Add(val); locStrs = new List <OasisLocalizedString>(); } output.Write(vals.Count); foreach (var val in vals) { var cpr = new CompressedValues(); using (var bs = new BinaryStream(1024)) { val.Serialize(bs); var buffer = bs.ToArray(); var size = buffer.Length; byte[] cprBuffer = null; var lz = new LZ4Compressor64(); var cprSize = lz.Compress(buffer, cprBuffer); cpr.CompressedBytes = cprBuffer; cpr.CompressedSize = cprSize; cpr.DecompressedSize = size; cpr.LastSortedCRC = val.SortedEnums.Last(); } cpr.Serialize(output); } }