Сохранить YamlStream из плагина YamlDotNet в текстовый файл
Мне нужно создать файл конфигурации YAML для узла ROS, внутри приложения C#. По сути, пользователи задают значения параметров, и я выбираю эти значения для записи файла YAML.
Я работаю над MonoDevelop с помощью замечательного плагина YamlDotNet от @Antoine Aubry. Однако, исходя из этого вопроса: динамически создавать документ Yaml из C#, я не могу найти способ сохранить документ YAML в простой текстовый файл вместо его вывода в консоль.
Я искал StreamWriter, TextWriter, Byte Converter и так много вещей, что я немного потерян здесь. Я использую этот пример кода, в этой скрипке https://dotnetfiddle.net/0raqgN
var address = new YamlMappingNode(
new YamlScalarNode("street"), new YamlScalarNode("123 Tornado Alley\nSuite 16") { Style = YamlDotNet.Core.ScalarStyle.Literal },
new YamlScalarNode("city"), new YamlScalarNode("East Westville"),
new YamlScalarNode("state"), new YamlScalarNode("KS")
) { Anchor = "main-address" };
var stream = new YamlStream(
new YamlDocument(
new YamlMappingNode(
new YamlScalarNode("repeipt"), new YamlScalarNode("Oz-Ware Purchase Invoice"),
new YamlScalarNode("date"), new YamlScalarNode("2007-08-06"),
new YamlScalarNode("customer"), new YamlMappingNode(
new YamlScalarNode("given"), new YamlScalarNode("Dorothy"),
new YamlScalarNode("family"), new YamlScalarNode("Gale")
),
new YamlScalarNode("items"), new YamlSequenceNode(
new YamlMappingNode(
new YamlScalarNode("part_no"), new YamlScalarNode("A4786"),
new YamlScalarNode("descrip"), new YamlScalarNode("Water Bucket (Filled)"),
new YamlScalarNode("price"), new YamlScalarNode("1.47"),
new YamlScalarNode("quantity"), new YamlScalarNode("4")
),
new YamlMappingNode(
new YamlScalarNode("part_no"), new YamlScalarNode("E1628"),
new YamlScalarNode("descrip"), new YamlScalarNode("High Heeled \"Ruby\" Slippers"),
new YamlScalarNode("price"), new YamlScalarNode("100.27"),
new YamlScalarNode("quantity"), new YamlScalarNode("1")
)
),
new YamlScalarNode("bill-to"), address,
new YamlScalarNode("ship-to"), address,
new YamlScalarNode("specialDelivery"), new YamlScalarNode("Follow the Yellow Brick\nRoad to the Emerald City.\nPay no attention to the\nman behind the curtain.") { Style = YamlDotNet.Core.ScalarStyle.Literal }
)
)
);
Последнее, что я попробовал, было это:
StreamWriter sw = new StreamWriter (@"/home/guillaume/test_yaml.yaml");
stream.Save (sw);
Но файл test_yaml.yaml остается пустым (0 октетов) каждый раз, хотя я хочу, чтобы он выглядел так:
repeipt: Oz-Ware Purchase Invoice
date: 2007-08-06
customer:
given: Dorothy
family: Gale
items:
- part_no: A4786
descrip: Water Bucket (Filled)
price: 1.47
quantity: 4
- part_no: E1628
descrip: High Heeled "Ruby" Slippers
price: 100.27
quantity: 1
bill-to: &main-address
street: |-
123 Tornado Alley
Suite 16
city: East Westville
state: KS
ship-to: *main-address
specialDelivery: |-
Follow the Yellow Brick
Road to the Emerald City.
Pay no attention to the
man behind the curtain.
...
Извините, если это похоже на вопрос нуба!
5 ответов
Для людей, которые находят это без ответа, я нашел другой ответ полезным. Короче, все правильно, кроме Save
вызов. Этот отрывок из другого ответа сделал файл действительно содержащим YAML:
using (TextWriter writer = File.CreateText("C:\\temp\\some-file.yaml")) {
yaml.Save(writer, false);
}
Я бы посоветовал вам создать класс, представляющий структуру данных, которую вы хотите поместить в YAML, и сериализовать этот класс, как показано в другом разделе YamlDotNet: Как сериализовать пользовательский класс с YamlDotNet
После этого вам нужно всего лишь создать объект вашего класса и использовать следующий код:
YourClass yourObject = new YourClass(param1, param2, param3);
using (StreamWriter streamWriter = new StreamWriter("yourFile.yaml")))
{
Serializer serializer = new SerializerBuilder().Build();
serializer.Serialize(streamWriter, yourObject);
}
С десериализацией, определенной классом (если вы когда-либо ее выполняете), все так же просто:
YourClass yourObject = new YourClass();
using (StreamReader streamReader = new StreamReader("yourFile.yaml"))
{
Deserializer deserializer = new DeserializerBuilder().IgnoreUnmatchedProperties().Build();
yourObject = (ProcessingProfile)deserializer.Deserialize(streamReader, typeof(YourClass));
}
using YamlDotNet.RepresentationModel;
using YamlDotNet.Serialization;
public static void DumpAsYaml(object data, string fileName)
{
//Console.WriteLine("***Dumping Object Using Yaml Serializer***");
var stringBuilder = new StringBuilder();
var serializer = new Serializer();
stringBuilder.AppendLine(serializer.Serialize(data));
Console.WriteLine($"Now writing {fileName}");
var stream = new FileStream(fileName, FileMode.OpenOrCreate);
using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8))
{
writer.Write(stringBuilder);
writer.Close();
}
}
Я просто новичок, но чтобы сохранить файл yaml своим кодом:
StreamWriter sw = new StreamWriter (@"/home/guillaume/test_yaml.yaml");
stream.Save (sw);
sw.Close();
вам следует добавить методы close(), чтобы закрыть StreamWriter. Меня устраивает
var stream = new YamlStream();
stream.Add(YamlDoc);
string output;
var sb = new StringBuilder();
using (var writer = new StringWriter(sb))
{
stream.Save(writer, false);
output = sb.ToString();
}
Console.WriteLine(output);