1

我正在使用 YAMLDotNet 库,并试图让 YamlVisitor 类触发它的事件,就像它到达每个节点类型的开始和结束时一样。如果流是使用文件或字符串的 StreamReader,这将正常工作,但如果我使用 serialPort 流,它会卡住(我想等待流结束??)

我的流是通过串行端口流动的数据,没有定义的结束。

我希望能够在每个 YAML 节点通过流时调用它们的开头和结尾处的函数。

这是我尝试过的:

static void Main(string[] args)
{
    using (var sp = new SerialPort("COM1", 600, Parity.Odd, 8, StopBits.One))
    {
        sp.Open();

        TextReader tr = new StreamReader(sp.BaseStream);
        var yaml = new YamlStream();

        // try assigning an instance of TracingVisitor before loading the stream...
        yaml.Accept(new TracingVisitor());

        // execution hangs at the following line 
        // waiting for something to indicate end of stream???
        yaml.Load(tr);
    }
}

当我打电话给yaml.Load(tr);它时,它就坐在那里等待。我能够收集到它会在令牌进入时对其进行处理,但 TracingVisitor 类中没有任何内容被调用。

这是将串行数据提供给流的程序。

// 's' is a properly formatted YAML String
// This code sends the contents of 's' it over COM7
void Main()
{
    // open a slow serial connection 
    using(var sp = new SerialPort("COM7", 600, Parity.Odd, 8, StopBits.One))
    {
        sp.Open();
        sp.Write(s);
    }
}

这是一个要运行的 YAML 字符串

#starting 
--- 
debug: |
  ->28 
  TxMessages 100, 
  RxMessages 100 
  Loopback Test - US: PASS 
... 
--- 
results: >
  TxMessages 100, 
  RxMessages 100, 
  Final: PASS 
--- 
results: [1,55,233,546.99]
... 
--- 
- ignore
- results: 
    min: -22
    max: 125
--- 
list:
    - 
    TxMessages: 100 
    RxMessages: 100
    results: [1,55,233,546.99]
    Loopback Test - US: PASS
    - results: result String Here!
...
4

1 回答 1

1

那是行不通的,因为YamlStream.Load将整个流加载到内存中。此外,不能分配访客;当您调用该Accept方法时,访问者访问当前状态。

如果您使用该类,您可以实现您想要的Deserializer,因为它对单个文档而不是整个流进行操作:

var deserializer = new Deserializer();
var eventReader = new EventReader(new Parser(new PipeReader(pipe)));

// Consume the initial StreamStart
eventReader.Expect<StreamStart>();

// Read each document
do
{
    var data = deserializer.Deserialize<Dictionary<string, object>>(eventReader);
    Console.WriteLine("{0}\t{1}", DateTime.Now, data["debug"]);
}
while(!eventReader.Accept<StreamEnd>());

在这个小提琴中创建了一个工作示例

如果每个文档的结构未知,则可以反序列化为object. 除非您使用标签,否则默认类型如下:

  • 映射将被反序列化为Dictionary<object, object>
  • 序列将被反序列化为List<object>
  • 标量将被反序列化为string

有关示例,请参见以下小提琴。

于 2014-10-12T15:23:43.887 回答