private static Expression BuildSizeCore(Type type, ObjectSerializationInfo serializationInfo, ParameterExpression instance) { List <Expression> ary = new List <Expression>(); LabelTarget returnTarget = Expression.Label(typeof(int), "returnLable"); if (!type.IsValueType) { //if (value==null) // goto label: 1; ary.Add(CommonExpressionMeta.Block_IfNullSize(instance, type, returnTarget)); } ParameterExpression size = Expression.Variable(typeof(int)); SerializeMemberInfo[] mems = serializationInfo.SerializeMemberInfos; if (mems.Length == 0) { ary.Add(Expression.Assign(size, Expression.Constant(Array3Cache.Empty.Length))); } else { int maxLen = mems[mems.Length - 1].KeyIndex + 1; ary.Add(Expression.Assign(size, Expression.Constant(BssomBinaryPrimitives.Array3HeaderSize(maxLen)))); FieldInfo memFormatters = serializationInfo.StoreMemberFormatterInstances(); int nullNumber = 0; int realIndex = 0; for (int i = 0; i < maxLen; i++) { if (mems[realIndex].KeyIndex != i) { nullNumber++; } else { //Size(mem.Value) ary.Add(SpecialCodeGenExpression.SizeValues(mems[realIndex], instance, size, memFormatters)); realIndex++; } } if (nullNumber > 0) { ary.Add(Expression.AddAssign(size, Expression.Constant(nullNumber * BssomBinaryPrimitives.NullSize))); } } ary.Add(Expression.Label(returnTarget, size)); return(Expression.Block(new ParameterExpression[] { size }, ary)); }