Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绘制形状并将文件保存为文本,编码和解码_C#_.net_Winforms - Fatal编程技术网

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

C# 绘制形状并将文件保存为文本,编码和解码,c#,.net,winforms,C#,.net,Winforms,我需要帮助在winform上保存绘制的形状,使用我创建的列表中的图形将形状类型和用户绘制的形状信息存储到文本文件中,该文本文件将其编码为UTF8(或根据他们的选择) 我的问题是在将“绘图”保存为文本文件后,它具有形状类型线、矩形等。如何在winform应用程序中打开它,使用graphics and paint事件解析数字并在winform上重新创建形状 我目前在代码中看到的是,用户将形状绘制到由鼠标事件处理的图形上,然后将其放入列表中。用户还选择文本文件的编码类型(如encoding.ASCII

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

我的问题是在将“绘图”保存为文本文件后,它具有形状类型线、矩形等。如何在winform应用程序中打开它,使用graphics and paint事件解析数字并在winform上重新创建形状

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

我查看了MSDNAPI,了解了如何为编码创建自己的格式,但我不知道该怎么做

我想做的是检查用户保存它的编码,然后选择适当的自定义格式在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(),而应该使用其他东西来编写。

这样做,从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...
string jsonStateOfShape=JsonConvert.SerializeObject(shapeList);
使用(FileStream-stream=newfilestream(“shapes.json”,FileMode.Create))
使用(StreamWriter=新StreamWriter(流))
{
writer.Write(jsonStateOfShape);
}
//重开
string rebootedstate=string.Empty;
使用(FileStream-stream=newfilestream(“shapes.json”,FileMode.Open))
使用(StreamReader=新StreamReader(stream))
{
rebootedState=reader.ReadToEnd();
}
var shapes=JsonConvert.DeserializeObject(重新启动状态);
shapes.ForEach(shapeList.Add);
//不要试图直接替换shapeList,引用问题。。。

这样做,从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...
string jsonStateOfShape=JsonConvert.SerializeObject(shapeList);
使用(FileStream-stream=newfilestream(“shapes.json”,FileMode.Create))
使用(StreamWriter=新StreamWriter(流))
{
writer.Write(jsonStateOfShape);
}
//重开
string rebootedstate=string.Empty;
使用(FileStream-stream=newfilestream(“shapes.json”,FileMode.Open))
使用(StreamReader=新StreamReader(stream))
{
rebootedState=reader.ReadToEnd();
}
var shapes=JsonConvert.DeserializeObject(重新启动状态);
shapes.ForEach(shapeList.Add);
//不要试图直接替换shapeList,引用问题。。。

有关序列化的更多信息:

首先,类应该包含[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();
将文件还原回您的类可以这样做:

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();

来源:

有关序列化的更多信息:

首先,类应该包含[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();
将文件还原回您的类可以这样做:

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();

来源:

编码可以用xml完成,很容易存储形状中包含的所有属性。我在记事本中打开文本文件,看到属性。当我在winform应用程序中使用FileOpenDialog打开它时,我如何知道什么属性是什么,以便使用createshape方法?我在我的帖子中添加了更多内容,以防我在编码方面出错。这取决于你,谁创建了编码。您还可以为每个具有所有属性的形状创建一个类,然后将它们序列化为xml甚至xmlbinary@AnthonyDekimpe谢谢你的提示,你有没有一个能让我把它转换成二进制的参考资料?这个问题对我来说太宽泛了。。。请查收。如果您需要将数据序列化而不是创建自己的格式,请考虑使用JSON。编码可以用XML完成,很容易存储形状中包含的所有属性。当我在winform应用程序中使用FileOpenDialog打开它时,我如何知道什么属性是什么,以便使用createshape方法?我在我的帖子中添加了更多内容,以防我在编码方面出错。这取决于你,谁创建了编码。您还可以为每个具有所有属性的形状创建一个类,然后将它们序列化为xml甚至xmlbinary@AnthonyDekimpe谢谢你的提示,你有没有一个能让我把它转换成二进制的参考资料?这个问题对我来说太宽泛了。。。请查收。如果您需要序列化数据而不是创建自己的格式,请考虑使用JSON。对于重新打开,在VAR形状=、in //Read打开的行中,我会得到一个错误。错误:其他信息:无法创建Draw.Shape类型的实例。类型是接口或抽象类,无法实例化。路径“[0]。PenColor”,第1行,位置13。您知道您的shapeList变量是什么类型的吗?仅供参考,Anthonys解决方案更适合您的应用程序;)就像桌面应用程序按惯例做事情一样……对于重新打开,我在//重新打开中的var shapes=行中得到一个错误。错误:其他信息:无法创建Draw.Shape类型的实例。类型是接口或抽象类,无法实例化。路径“[0]。PenColor”,第1行,位置13。您知道您的shapeList变量是什么类型的吗?仅供参考,Anthonys解决方案更适合您的应用程序;)就像桌面应用程序按惯例做事一样。。。