protected override Stream UnParse()
        {
            Stream s  = new MemoryStream();
            var    bw = new BinaryWriter(s);

            bw.Write(mVersion);
            var  keys     = new ResourceKeyTable();
            long startPos = keys.BeginWrite(s);

            if (mShaderKeyList == null)
            {
                mShaderKeyList = new ShaderKeyList(OnResourceChanged);
            }
            mShaderKeyList.UnParse(s);
            if (mSkinSubSRampKey == null)
            {
                mSkinSubSRampKey = new TGIBlock(0, OnResourceChanged);
            }
            if (mToneRampKey == null)
            {
                mToneRampKey = new TGIBlock(0, OnResourceChanged);
            }
            bw.Write(keys.Add(mSkinSubSRampKey));
            bw.Write(keys.Add(mToneRampKey));
            if (mTextureKeyList == null)
            {
                mTextureKeyList = new TextureKeyList(OnResourceChanged, this);
            }
            mTextureKeyList.UnParse(s, keys);
            bw.Write(mIsDominant ? (byte)1 : (byte)0);
            keys.EndWrite(s, startPos);
            return(s);
        }
        private void Parse(Stream s)
        {
            var br = new BinaryReader(s);

            mVersion = br.ReadUInt32();
            var keys = new ResourceKeyTable();

            ResourceKeyTable.TablePtr ptr = keys.BeginRead(s);
            mShaderKeyList   = new ShaderKeyList(OnResourceChanged, s);
            mSkinSubSRampKey = new TGIBlock(0, OnResourceChanged, keys[br.ReadInt32()]);
            mToneRampKey     = new TGIBlock(0, OnResourceChanged, keys[br.ReadInt32()]);
            mTextureKeyList  = new TextureKeyList(OnResourceChanged, s, this, keys);
            mIsDominant      = br.ReadByte() == 1;
            keys.EndRead(s, ptr);
        }