7

現在、YamlDotNet ライブラリを使用して、YAML ドキュメントstringをスカラー値やマッピングなどの標準の .NET オブジェクトに逆シリアル化しようとしています。Dictionary<string, object>

そのクラスが最良の選択肢だと思いDeserializerますが、その出力はobjectandDictionary<object>です。私はこのようなカスタムを実装しようとしINodeTypeResolverました:

class MyNodeTypeResolver : INodeTypeResolver
{
    bool INodeTypeResolver.Resolve(NodeEvent nodeEvent, ref Type currentType)
    {
        if (currentType == typeof(object))
        {
            if (nodeEvent is SequenceStart)
                currentType = typeof(List<object>);
            else if (nodeEvent is MappingStart)
                currentType = typeof(Dictionary<string, object>);
            else if (nodeEvent is Scalar)
                currentType = typeof(string);

            return true;
        }

        return false;
    }
}

そしてそれを次のように使用します:

Deserializer deserializer = new Deserializer();
deserializer.TypeResolvers.Add(new MyNodeTypeResolver());
var res = deserializer.Deserialize(input);

しかし、それは何の効果もないようです。によって生成されるオブジェクトのタイプを変更する方法はありますDeserializerか?

4

2 に答える 2

0

AFAIK、Deserialize は型パラメーターを受け取ります。これは本当に素晴らしいです

%YAML 1.1
%TAG !namespace! _MyNamespace.NestedClass.Whatever.
---

entry_0: !namespace!MyMessage
  format: Alert
  desc: "Entry One! Uses the exact string representation of the desired type. (A bit fragile, IMHO)"

entry_1: !!message
  format: Default
  desc: "Entry Two! Uses a type registered beforehand."

entry_2:
  format: Default
  desc: "Entry Three! Just winging it, sometimes YamlDotNet is exceedingly clever."

...

によってデシリアライズできます

var dict = new Deserializer().Deserialize<Dictionary<string,MyMessage>>(
    new StringReader(that_doc_up_there));

MyMessage に format プロパティと desc プロパティがあり、名前空間に含まれていないことが条件です。存在する場合は、事前にデシリアライザーに登録するか、新しいタグを作成することができます。%TAG エイリアスはタグの最初の文字を食べてしまいそうなので、アンダースコアを入れました。たぶんバグです。もう1つの方法は、それを登録することです。

deserializer.RegisterTagMapping(
    "tag:yaml.org,2002:message", typeof(MyMessage));
于 2015-08-26T05:18:36.147 に答える