私がこれを行う方法は、スライドを構成するすべての情報を格納するクラスを定義し (そのため、コードでスライドを表すことができる)、プレゼンテーションと呼ばれるスライドのリストをシリアル化することです。 XML ファイル。
各スライドには、画像、テキストボックスなど、さまざまな数のコントロールがあるため、最初にコントロールを定義しましょう。
public class MySlideClass
{
public class Control
{
public Point Position { get; set; }
public Size Size { get; set; }
public Color Background { get; set; }
public Color Forground { get; set; }
public Image Picture { get; set; }
public string Text { get; set; }
public float TextSize { get; set; }
public Point TextPosition { get; set; }
// ...
public float Transparency { get; set; }
public bool Visible { get; set; }
public Control()
{
}
}
public class Slide
{
[XmlAttribute]
public string Name { get; set; }
//
public string Title { get; set; }
public Size Size { get; set; }
public Color Background { get; set; }
public Color Forground { get; set; }
public float Transparency { get; set; }
public bool Visible { get; set; }
public List<Control> Children { get; set; }
public Slide()
{
}
}
public MySlideClass()
{
}
}
明らかに、必要に応じてプロパティを追加/削除できます。
{ get; set; }
and 空のデフォルト コンストラクタに注意してください。クラスは、パブリック プロパティ (get/set で定義された変数) で構成XMLSerializer
され、クラスをシリアル化できるように空の既定のコンストラクターを持っている必要があります (空でない他のコンストラクターを指定することもできます)。
次のようにクラスを使用します。
public void SaveSlideTest()
{
// New control
MySlideClass.Control newControl = new MySlideClass.Control();
newControl.Position = new Point(20,30);
newControl.Size = new Size(75,25);
newControl.Text = "Image1";
newControl.TextPosition= new Point(0,25);
//ctl.Picture = new Bitmap("image1.bmp");
// Add control to children list
List<MySlideClass.Control> childrenControls = new List<MySlideClass.Control>();
childrenControls.Add(newControl);
// New slide
MySlideClass.Slide newSlide = new MySlideClass.Slide();
newSlide.Name = "Slide1";
newSlide.Title = "New Slide";
newSlide.Size = new Size(200,100);
// Add child controls to slide
newSlide.Children = childrenControls;
// Add slide to presentation or 'slideshow'
List<MySlideClass.Slide> mySlidePresentation = new List<MySlideClass.Slide>();
mySlidePresentation.Add( newSlide );
// Save presentation to XML
SerializeObject("SavedSlidePresentation.xml",mySlidePresentation);
}
あなたの SavedSlidePresentation.xml は次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfSlide xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Slide Name="Slide1">
<Title>New Slide</Title>
<Size>
<Width>200</Width>
<Height>100</Height>
</Size>
<Background />
<Forground />
<Transparency>0</Transparency>
<Visible>false</Visible>
<Children>
<Control>
<Position>
<X>20</X>
<Y>30</Y>
</Position>
<Size>
<Width>75</Width>
<Height>25</Height>
</Size>
<Background />
<Forground />
<Text>Image1</Text>
<TextSize>0</TextSize>
<TextPosition>
<X>0</X>
<Y>25</Y>
</TextPosition>
<Transparency>0</Transparency>
<Visible>false</Visible>
</Control>
</Children>
</Slide>
</ArrayOfSlide>
シリアライズ/デシリアライズ関数は次のとおりです。
public static List<MySlideClass.Slide> DeserializePresentation(string FileName)
{
List<MySlideClass.Slide> returnList = new List<MySlideClass.Slide>();
using(StreamReader streamReader = new StreamReader(FileName))
{
XmlSerializer xmlReader = new XmlSerializer(typeof(List<MySlideClass.Slide>));
returnList = (List<MySlideClass.Slide>) xmlReader.Deserialize(streamReader);
}
return returnList;
}
// A generic object serializer
public static void SerializeObject(string Filename,object Obj)
{
using(StreamWriter streamWriter = new StreamWriter(Filename))
{
XmlSerializer xmlSerializer = new XmlSerializer(Obj.GetType());
xmlSerializer.Serialize(streamWriter,Obj);
}
}
これは よりも堅牢である必要がありますDictionary<TKey,TValue>
。
注意すべき重要な点の 1 つは、プロパティを Slide または Control クラスに追加することにした場合、デシリアライザーは古いバージョンのデータ クラスを使用して XML ファイルを逆シリアル化することができなくなります。
その場合、1) 古いバージョンの XML ファイルを手動または別の方法で変換するか、2)ISerializable
クラスにインターフェイスを実装する (推奨) ことができます。