Пример #1
0
            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);
                    }
                }
            }
Пример #2
0
            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);
                }
            }