绘制形状并将文件保存为文本,编码和解码

时间:2016-02-07 07:03:52

标签: c# .net winforms

我需要帮助在winform上保存绘制的形状,使用我创建的列表中的图形将形状类型和用户绘制的形状信息存储到一个文本文件中,该文件将其编码为UTF8(或他们选择的) 。

我的问题是在保存“绘图”后,其中包含形状类型的线条,矩形等作为文本文件。如何在winform应用程序中打开它并解析数字并使用图形和绘制事件在winform上重新创建形状?

我目前在代码中拥有的是用户将形状绘制到由鼠标事件处理的图形上,然后进入列表。用户还选择文本文件的编码类型(如Encoding.ASCII等)然后我有一个保存菜单,用户将文件保存到一个位置。还有一个清晰的按钮来清除图纸等。然后我无法弄清楚如何打开文本文件来重新创建已清除的已保存图形。

我查看了有关为编码创建自己的格式的msdn API,但我对如何操作感到困惑。

我想做的是检查用户保存的编码,然后选择适当的自定义格式以在winform图形上重新创建形状。

有什么想法吗?谢谢。

编辑: 我用来保存文本文件的代码:

                using (BinaryWriter save_bin = new BinaryWriter(File.Open(save_fd.FileName, FileMode.OpenOrCreate), Encoding.UTF8))
                {
                    foreach (Shape a in shapeList)
                    {
                        save_bin.Write(a.ToString());
                    }
                    save_bin.Close();
                }

我认为我不应该使用ToString(),而是要写其他东西。

2 个答案:

答案 0 :(得分:1)

从NuGet执行此操作,下载JSON.Net

PM> Install-Package Newtonsoft.Json 

接下来,复制此代码

string jsonStateOfShape = JsonConvert.SerializeObject(shapeList);
using (FileStream stream = new FileStream("shapes.json", FileMode.Create))
using (StreamWriter writer = new StreamWriter(stream))
{
    writer.Write(jsonStateOfShape);
}


// To re open
string reopenedState = string.Empty;
using (FileStream stream = new FileStream("shapes.json", FileMode.Open))
using (StreamReader reader = new StreamReader(stream))
{
    reopenedState = reader.ReadToEnd();
}
var shapes = JsonConvert.DeserializeObject<List<Shape>>(reopenedState);

shapes.ForEach(shapeList.Add);

// dont try to replace shapeList directly, referencing issues...

答案 1 :(得分:1)

有关序列化的更多信息:

首先,您的类应包含[Serializable]属性

[Serializable]
public class Example()
{

}

然后你就可以像这样保存它:

Example obj = new Example();

// Set properties of the 'Example' object

IFormatter formatter = new BinaryFormatter(); // Save the file
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();

将文件恢复到您的课程可以这样做:

IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject) formatter.Deserialize(stream);
stream.Close();

来源:https://msdn.microsoft.com/en-us/library/4abbf6k0(v=vs.110).aspx