如何将C#中的类型类对象序列化和反序列化为YAML?

如何将C#中的类型类对象序列化和反序列化为YAML?,c#,serialization,deserialization,yaml,yamldotnet,C#,Serialization,Deserialization,Yaml,Yamldotnet,我需要将以下类型层次结构序列化到YAML中 var Variable1 = new { Name = "Variable1", Type = typeof(Int32), OverWrite = true, Value = 10 }; var Variable2 = new { Name = "Variable1", Type = typeof(Int32), OverWrite = true, Value = 10 }; var

我需要将以下类型层次结构序列化到YAML中

var Variable1 = new
{
    Name = "Variable1",
    Type = typeof(Int32),
    OverWrite = true,
    Value = 10
};
var Variable2 = new
{
    Name = "Variable1",
    Type = typeof(Int32),
    OverWrite = true,
    Value = 10
};

var Job = new
{
    Name = "Job1",
    JobID = 1,
    JobState = "Draft",
    JobStatus = false,
    Parameters = new[]
    {
        Variable1,
        Variable2
    },
    LocalVariables = new[]
    {
        Variable1
    }
};
在这里,我得到了一个例外

An unhandled exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll
其他信息:调用的目标已引发异常。{“只能对Type.IsGenericParameter为true的类型调用方法。”}


请帮忙

这是因为您试图序列化
系统。键入
。这种类型有很多属性,其中一些属性会抛出您看到的异常。上讨论了这一点,但在这种情况下,修复方法是完全避免序列化
系统。键入

理想情况下,您将能够注册一个自定义类型转换器来处理
System.type
,并将其序列化为字符串,但是由于,仍然可以访问该属性

最好的解决方案可能是将
系统包装起来。在自定义类中键入
,然后根据需要进行序列化:

public struct SerializableType : IYamlConvertible
{
    private Type type;

    void IYamlConvertible.Read(IParser parser, Type expectedType, ObjectDeserializer nestedObjectDeserializer)
    {
        var typeName = (string)nestedObjectDeserializer(typeof(string));
        type = typeName != null ? Type.GetType(typeName) : null;
    }

    void IYamlConvertible.Write(IEmitter emitter, ObjectSerializer nestedObjectSerializer)
    {
        nestedObjectSerializer(type != null ? type.AssemblyQualifiedName : null);
    }

    public static implicit operator Type(SerializableType value)
    {
        return value.type;
    }

    public static implicit operator SerializableType(Type value)
    {
        return new SerializableType { type = value };
    }
}
编辑 提到的问题已经解决了。如果您尝试,您将能够通过注册自定义
IYamlTypeConverter
实现您想要的:

public class SystemTypeTypeConverter : IYamlTypeConverter
{
    public bool Accepts(Type type)
    {
        return typeof(Type).IsAssignableFrom(type);
    }

    public object ReadYaml(IParser parser, Type type)
    {
        var scalar = parser.Expect<Scalar>();
        return Type.GetType(scalar.Value);
    }

    public void WriteYaml(IEmitter emitter, object value, Type type)
    {
        var typeName = ((Type)value).AssemblyQualifiedName;
        emitter.Emit(new Scalar(typeName));
    }
}

// ....

var serializer = new SerializerBuilder()
    .WithTypeConverter(new SystemTypeTypeConverter())
    .Build();

var yaml = serializer.Serialize(new TypeContainer
{
    Type = typeof(string),
});

var deserializer = new DeserializerBuilder()
    .WithTypeConverter(new SystemTypeTypeConverter())
    .Build();

var result = deserializer.Deserialize<TypeContainer>(yaml);

Assert.Equal(typeof(string), result.Type);
公共类SystemTypeConverter:IYamlTypeConverter
{
公共布尔接受(类型)
{
返回类型(Type).IsAssignableFrom(Type);
}
公共对象ReadYaml(IParser解析器,类型)
{
var scalar=parser.Expect();
返回类型.GetType(标量.Value);
}
public void WriteYaml(IEmiter发射器、对象值、类型)
{
变量typeName=((类型)值).AssemblyQualifiedName;
Emit(新标量(typeName));
}
}
// ....
var serializer=new SerializerBuilder()
.WithTypeConverter(新系统类型转换器())
.Build();
var yaml=serializer.Serialize(新类型容器
{
类型=类型(字符串),
});
var deserializer=新的DeserializerBuilder()
.WithTypeConverter(新系统类型转换器())
.Build();
var result=反序列化程序。反序列化(yaml);
Assert.Equal(typeof(string)、result.Type);

当我在变量部分注释行[Type=typeof(Int32),]时,它成功地序列化了DHI,有没有办法将C#中的复杂类型(如DataTable)序列化为YAML?因为我是YAML的初学者,你能解释一下基础知识吗??感谢基本上,技术是一样的。您可以注册一个自定义
IYamlTypeConverter
,该转换器处理序列化和反序列化。但是如果你问一个新的问题会更好,这样我才能正确地回答。