看如下代码 如何进行序列化和反序列化,是设计的问题吗?
1 class Digit : IGoods
2 {
3 public String name
4 {
5 get
6 { return "Digit"; }
7 }
8
9 public int Power = 220;
10
11 }
12
13 class Book : IGoods
14 {
15 public String name
16 {
17 get
18 { return "Book"; }
19 }
20
21 public String isbn = "123xxx";
22
23 }
24
25 public interface IGoods
26 {
27 String name { get; }
28 }
29
30 public class Shop
31 {
32 public List<IGoods> LGood { get; set; }
33
34 public Shop()
35 {
36 LGood = new List<IGoods>();
37 }
38 public void addtoShop(IGoods lg)
39 {
40 LGood.Add(lg);
41 }
42 }
43
44 static void Main(string[] args)
45 {
46
47
48 Shop shop=new Shop();
49
50 shop.addtoShop( new Book());
51
52 shop.addtoShop(new Digit());
53 XmlSerializer xs1 = new XmlSerializer(typeof(Shop));
54 FileStream fs1 = new FileStream("test.xml", FileMode.Create, FileAccess.Write);
55 xs1.Serialize(fs1, shop);
56 fs1.Close();
57 }
XmlSerializer不支持接口申明,不过这里可以改为抽象类。要么自己控制Class中序列化的方法来进行序列化。
接口只是一个协议,它本身是没有实现方式的,其实例也谈不上序列化出来,关键的还是class本身。
同时你发布的代码没加[Serializable]申明。
序列化和接口没有关系,直接和被序列化的运行时的类型有关,只要你的Book类和Digit类上有[Serializable]就能序列化吧
1、需要在Class前加上[Serializable]标签
2、抽象类适合事物的抽象,接口适合动作的规约。Goods作为抽象类更加合适。
3、附上一段关于定义可序列化类的代码片段:
public enum EntityType { Dict, SysDict, Data };
[Serializable]
[XmlType("entity")]
public class EntityMeta
{
private EntityType _type = EntityType.Data;
private string _primaryKey = "UID";
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("caption")]
public string Caption { get; set; }
[DefaultValue("UID")]
[XmlAttribute("primaryKey")]
public string PrimaryKey
{
get
{
return _primaryKey;
}
set
{
_primaryKey = value;
}
}
[XmlArray("properties")]
public PropertyMetaCollection PropertyMetaSet { get; set; }