public override void Write(object value, ProtoWriter dest) { IList arr = (IList)value; int len = arr.Count; SubItemToken token; bool writePacked = (options & OPTIONS_WritePacked) != 0; bool fixedLengthPacked = writePacked && CanUsePackedPrefix(); if (writePacked) { ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, dest); if (fixedLengthPacked) { ProtoWriter.WritePackedPrefix(arr.Count, packedWireType, dest); token = new SubItemToken(); // default } else { token = ProtoWriter.StartSubItem(value, dest); } ProtoWriter.SetPackedField(fieldNumber, dest); } else { token = new SubItemToken(); // default } bool checkForNull = !SupportNull; for (int i = 0; i < len; i++) { object obj = arr[i]; if (checkForNull && obj == null) { throw new NullReferenceException(); } Tail.Write(obj, dest); } if (writePacked) { if (fixedLengthPacked) { ProtoWriter.ClearPackedField(fieldNumber, dest); } else { ProtoWriter.EndSubItem(token, dest); } } }
public override void Write(object value, ProtoWriter dest) { SubItemToken token; bool writePacked = WritePacked; bool fixedSizePacked = writePacked & CanUsePackedPrefix(value) && value is ICollection; if (writePacked) { ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, dest); if (fixedSizePacked) { ProtoWriter.WritePackedPrefix(((ICollection)value).Count, packedWireType, dest); token = default(SubItemToken); } else { token = ProtoWriter.StartSubItem(value, dest); } ProtoWriter.SetPackedField(fieldNumber, dest); } else { token = new SubItemToken(); // default } bool checkForNull = !SupportNull; foreach (object subItem in (IEnumerable)value) { if (checkForNull && subItem == null) { throw new NullReferenceException(); } Tail.Write(subItem, dest); } if (writePacked) { if (fixedSizePacked) { ProtoWriter.ClearPackedField(fieldNumber, dest); } else { ProtoWriter.EndSubItem(token, dest); } } }