void Serialize(MegaloScriptModel model, IO.BitStream s, Proto.MegaloScriptProtoVariableReference protoType)
        {
            s.Stream(ref Type, protoType.TypeBitLength);
            if (Type < 0 || Type >= protoType.Members.Count)
            {
                throw new System.IO.InvalidDataException(string.Format(Util.InvariantCultureInfo,
                                                                       "{0}/{1}: Encountered invalid {2} type data",
                                                                       s.StreamName, model.MegaloVariant.BaseVariant.Header.Title, mReferenceKind));
            }

            var member = protoType.Members[Type];

            if (member.HasDataType)
            {
                MegaloScriptEnumValue.SerializeValue(model, s, member.EnumValueType, ref DataType);
            }
            else
            {
                DataType = TypeExtensions.kNone;
            }

            if (member.HasDataValue)
            {
                SerializeData(model, s, member.ValueType);
            }
            else
            {
                Data = TypeExtensions.kNone;
            }
        }
        void Serialize <TDoc, TCursor>(MegaloScriptModel model, IO.TagElementStream <TDoc, TCursor, string> s,
                                       Proto.MegaloScriptProtoVariableReference protoType)
            where TDoc : class
            where TCursor : class
        {
            const string kTypeAttributeName = "varRefType";

            if ((model.TagElementStreamSerializeFlags & MegaloScriptModelTagElementStreamFlags.UseEnumNames) != 0)
            {
                s.StreamAttributeIdAsString(kTypeAttributeName, ref Type,
                                            protoType, ToMemberIndex, FromMemberIndex);
            }
            else
            {
                s.StreamAttribute(kTypeAttributeName, ref Type);
            }

            var member = protoType.Members[Type];

            if (member.HasDataType)
            {
                MegaloScriptEnumValue.SerializeValue(model, s, member.EnumValueType, ref DataType,
                                                     IO.TagElementNodeType.Attribute, "dataType");
            }
            else
            {
                DataType = TypeExtensions.kNone;
            }

            if (member.HasDataValue)
            {
                SerializeData(model, s, member.ValueType);
            }
            else
            {
                Data = TypeExtensions.kNone;
            }
        }