2016-02-07 57 views
0

我需要幫助,使用我創建的將用戶繪製的形狀類型和形狀信息的列表中的圖形保存到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(),但沒有別的東西可寫。

+0

編碼可能是用xml完成​​,很容易存儲形狀中包含的所有屬性。 –

+0

我打開記事本中的文本文件並查看屬性。當我在Winform應用程序中使用FileOpenDialog打開它時,我怎麼知道什麼屬性是什麼,以便我可以使用createshaha方法?我在帖子中添加了更多內容,以防我編碼錯誤。 – Roys

+0

這取決於你,他創建了編碼。你也可以爲每個形狀創建一個具有所有屬性的類,然後將它們序列化爲xml或甚至二進制 –

回答

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

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... 
+0

對於重新打開,我在/ var重新打開時出現錯誤,var shapes =。 錯誤: 附加信息:無法創建類型爲Draw.Shape的實例。 Type是一個接口或抽象類,不能實例化。路徑'[0] .PenColor',第1行,第13位。 – Roys

+0

你知道你的shapeList變量,它是什麼類型 –

+0

僅供參考,Anthonys解決方案更適合你的應用程序;)就像桌面應用按照慣例做事一樣。 。 –