public void Initialize <T>(ref T value)
        {
            lock (messageUtilsLock)
            {
                object obj = (object)value;
                Type   t   = typeof(T);
                marshaler.EnterContext();
                foreach (FieldInfo field in
                         t.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
                {
                    Type ft = field.FieldType;
                    if (ft.IsEnum)
                    {
                        bool exclusive = !MarshalingDescriptor.HasAttribute(ft, typeof(FlagsAttribute));

                        if (exclusive)
                        {
                            FieldInfo[] df =
                                ft.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
                            if (df != null && df.Length > 0)
                            {
                                field.SetValue(obj, df[0].GetRawConstantValue());
                            }
                        }
                    }
                    else if (ft.IsArray)
                    {
                        int size, length;
                        marshaler.GetAdvocatedSize(new MarshalingDescriptor(ft, field), out size, out length);
                        if (size >= 0)
                        {
                            if (ft.IsArray)
                            {
                                field.SetValue(obj, Array.CreateInstance(ft.GetElementType(), size));
                            }
                            else
                            {
                                field.SetValue(obj, CreateSequence(ft.GetGenericArguments()[0], size));
                            }
                        }
                    }
                    marshaler.DefineSymbol(field.Name, field.GetValue(obj));
                }
                marshaler.ExitContext();

                List <MethodInfo> ms;
                if (initializers.TryGetValue(t, out (ms)))
                {
                    foreach (MethodInfo m in ms)
                    {
                        object[] args = new object[] { obj };
                        m.Invoke(this, args);
                        obj = args[0];
                    }
                }

                value = (T)obj;
            }
        }