예제 #1
0
        public MessagePackSerializer <TObject> CreateSerializer()
        {
            SerializingMember[] source = (from item in SerializerBuilder <TObject> .GetTargetMembers()
                                          orderby item.Contract.Id
                                          select item).ToArray <SerializingMember>();
            if (source.Length == 0)
            {
                throw SerializationExceptions.NewNoSerializableFieldsException(typeof(TObject));
            }
            if (source.All <SerializingMember>(item => item.Contract.Id == -1))
            {
                return(this.CreateSerializer((from item in source
                                              orderby item.Contract.Name
                                              select item).ToArray <SerializingMember>()));
            }
            Contract.Assert(source[0].Contract.Id >= 0);
            if (this.Context.CompatibilityOptions.OneBoundDataMemberOrder && (source[0].Contract.Id == 0))
            {
                throw new NotSupportedException("Cannot specify order value 0 on DataMemberAttribute when SerializationContext.CompatibilityOptions.OneBoundDataMemberOrder is set to true.");
            }
            List <SerializingMember> list = new List <SerializingMember>(source.Max <SerializingMember>(item => item.Contract.Id) + 1);
            int index = 0;

            for (int i = this.Context.CompatibilityOptions.OneBoundDataMemberOrder ? 1 : 0; index < source.Length; i++)
            {
                Contract.Assert(source[index].Contract.Id >= 0);
                if (source[index].Contract.Id < i)
                {
                    throw new SerializationException(string.Format(CultureInfo.CurrentCulture, "The member ID '{0}' is duplicated in the '{1}' type.", new object[] { source[index].Contract.Id, typeof(TObject) }));
                }
                while (source[index].Contract.Id > i)
                {
                    SerializingMember member = new SerializingMember();
                    list.Add(member);
                    i++;
                }
                list.Add(source[index]);
                index++;
            }
            return(this.CreateSerializer(list.ToArray()));
        }
		internal static PolymorphismSchema Create(
			Type type,
#if !UNITY
			SerializingMember? memberMayBeNull
 public static string aotName(SerializingMember item)
 {
     return(item.Contract.Name);
 }
 public static bool aotBool(SerializingMember item)
 {
     return(item.Contract.Id == DataMemberContract.UnspecifiedId);
 }
 public static int aotInt(SerializingMember item)
 {
     return(item.Contract.Id);
 }