public static object ReadFromStream(this Type type, CodedInputStream input) { if (_readHandlers.TryGetValue(type, out var h)) { return(h(input)); } else if (type.IsPbMessageType()) { var obj = (IMessage)Activator.CreateInstance(type); input.ReadMessage(obj); return(obj); } else if (type.IsUserType()) { var obj = (UserType)Activator.CreateInstance(type); var holder = new UserTypeHolder(); input.ReadMessage(holder); obj.Unpack(holder); return(obj); } else { throw new Exception($"Unable to read for type {type}."); } }
public void Unpack(UserTypeHolder holder) { foreach (var fi in GetFieldInfos()) { var val = fi.Packer.Unpack(holder.Fields[fi.Name]); fi.FieldInfo.SetValue(this, val); } }
public static T DeserializeToUserType <T>(this byte[] bytes) where T : UserType, new() { var obj = new T(); var msg = new UserTypeHolder(); msg.MergeFrom(bytes); obj.Unpack(msg); return(obj); }
public UserTypeHolder Pack() { var holder = new UserTypeHolder(); foreach (var fi in GetFieldInfos()) { var val = fi.FieldInfo.GetValue(this); holder.Fields.Add(fi.Name, fi.Packer.Pack(val)); } return(holder); }