public ObjectSpecs?GetObjectSpecs(Type objType)
        {
            var memberSpecs = new MemberSpecs(objType);

            memberSpecs.Init();

            object?deserializeObj = null;
            object?serializeObj   = null;

            return(new ObjectSpecs(
                       memberSpecs,

                       (serializer, argList) =>
            {
                var constructorSpecs = new MethodSpecs(FindConstructor(objType));
                constructorSpecs.Init();

                deserializeObj = MethodInvoker.InvokeMethod(serializer, constructorSpecs, null, argList);
                Debug.Assert(deserializeObj != null);
                return deserializeObj;
            },
                       (spec, value) =>
            {
                memberSpecs.TryGetMember(spec, out var memberInfo);
                memberInfo.SetValue(deserializeObj, value);
            },
                       (_, _) => deserializeObj,

                       (_, obj) => serializeObj = obj,
                       spec =>
            {
                memberSpecs.TryGetMember(spec, out var memberInfo);
                return memberInfo.GetValue(serializeObj);
            },
                       (_, _) => { }));
        }
        public string SerializeSingleValue(CommandLineSerializer serializer, Type objType, object?obj)
        {
            if (obj == null)
            {
                throw new ArgumentNullException(nameof(obj));
            }

            var memberSpecs = new MemberSpecs(objType);

            memberSpecs.Init();

            var argList = serializer.Serialize(memberSpecs, spec =>
            {
                memberSpecs.TryGetMember(spec, out var memberInfo);
                return(memberInfo.GetValue(obj));
            });

            return(ImplUtil.MergeCommandLine(argList));
        }