Dictionary在XML序列化时遇到的问题及应对方案

在项目中需要一个Dictionary来保存键值对,类型为Dictionary<string,List<string>>,在向文件流中序列化的时候出现了错误,查询资料发现.net中的XmlSerializer不支持Dictionary,网上有很多应对方案,但都比较复杂,用起来总觉得心里不够踏实(害怕BUG),下面从另一个角度,在序列化和反序列化的时候进行数据类型的转换,从而达到序列化的目的,示例代码如下:
ExpandedBlockStart.gifContractedBlock.gif/**//// <summary>
InBlock.gif        
/// This class is used for xml serialization on generic type Dictionary
ExpandedBlockEnd.gif        
/// </summary>

None.gif        public class DictionaryHolder
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif{
InBlock.gif            
public string logicalName = "";
InBlock.gif            
public List<string> physicalNames = new List<string>();
ExpandedBlockEnd.gif        }

None.gif
ExpandedBlockStart.gifContractedBlock.gif        
/**//// <summary>
InBlock.gif        
/// Loads the specified database.
InBlock.gif        
/// </summary>
ExpandedBlockEnd.gif        
/// <param name="database">The database.</param>

None.gif        public void load(string database)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif{
InBlock.gif            FileStream fs 
= null;
InBlock.gif            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                XmlSerializer xs 
= new XmlSerializer(typeof(List<DictionaryHolder>));
InBlock.gif                fs 
= new FileStream(database, FileMode.Open, FileAccess.Read, FileShare.Read);
InBlock.gif                List
<DictionaryHolder> holders = (List<DictionaryHolder>)xs.Deserialize(fs);
InBlock.gif                
this._dictionary.Clear();
InBlock.gif                
foreach (DictionaryHolder holder in holders)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
this._dictionary.Add(holder.logicalName, holder.physicalNames);
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            
catch(Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
throw;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
if (fs != null)
InBlock.gif                    fs.Close();
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

None.gif
ExpandedBlockStart.gifContractedBlock.gif        
/**//// <summary>
InBlock.gif        
/// Saves the specified database.
InBlock.gif        
/// </summary>
ExpandedBlockEnd.gif        
/// <param name="database">The database.</param>

None.gif        public void save(string database)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif{
InBlock.gif            FileStream fs 
= null;
InBlock.gif            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                List
<DictionaryHolder> holders = new List<DictionaryHolder>();
InBlock.gif                
foreach (string key in this._dictionary.Keys)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    DictionaryHolder holder 
= new DictionaryHolder();
InBlock.gif                    holder.logicalName 
= key;
InBlock.gif                    holder.physicalNames 
= this._dictionary[key];
InBlock.gif                    holders.Add(holder);
ExpandedSubBlockEnd.gif                }

InBlock.gif                XmlSerializer xs 
= new XmlSerializer(typeof(List<DictionaryHolder>));
InBlock.gif                fs 
= new FileStream(database, FileMode.Create, FileAccess.Write, FileShare.Read);
InBlock.gif                xs.Serialize(fs, holders);
ExpandedSubBlockEnd.gif            }

InBlock.gif            
catch (Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
throw;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
if (fs != null)
InBlock.gif                    fs.Close();
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

经测试,可以正常工作,这里我们实际上采用了目标转换的手法,将待序列化的对象转换为自定义的支持序列化的类型,在反序列化的时候首先反序列化为自定义的对象类型,然后再构造最终对象。

个人觉得微软应该针对Dictionary添加XML序列化支持,因为它的数据结构可以很轻易的映射到XML文档中:键值映射为一个节点,该键值对应的对象映射为此节点的子节点。

转载于:https://www.cnblogs.com/swnuwangyun/archive/2007/03/27/689812.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值