SerializerCombine 方法 (ITextReader, Object, Boolean) |
命名空间: XPatchLib
public Object Combine( ITextReader pReader, Object pOriValue, bool pOverride )
如果为 true ,那么附加增量数据时将直接更新 pOriValue 对象实例。(性能更加,在无需保留原始数据实例的情况下,建议使用此方式)
相反,如果为 false ,那么会在附加数据前根据 pOriValue 创建新的对象实例 ,再在新的对象实例上附加增量数据。(适用于不希望原始数据被变更的情况)
当待处理的类型是以下类型时,此参数无效,始终创建新实例:
数组类型,ISerializable。
在反序列化及合并之前,必须使用待合并的对象的类型构造一个 Serializer 。
下面的示例使用 XmlTextReader 对象反序列化增量内容,并附加至原始对象。
using System; using System.IO; using System.Xml; namespace XPatchLib.Example { public class CombineExample { public static void Main() { var example = new CombineExample(); example.CombineObject("patch.xml"); } private void CombineObject(string filename) { OrderedItem oldOrderItem = null; OrderedItem newOrderItem = null; var serializer = new Serializer(typeof(OrderedItem)); using (var fs = new FileStream(filename, FileMode.OpenOrCreate)) { oldOrderItem = new OrderedItem { Description = "Big Widget", ItemName = "Widgt", Quantity = 0, UnitPrice = (decimal) 4.7 }; // 采用不改动现有 oldOrderItem 合并方式,将增量内容与 oldOrderItem 内容进行合并,产生新的对象实例 newOrderItem // newOrderItem 与 oldOrderItem 非同一对象。 using (var reader = new XmlTextReader(fs)) { newOrderItem = (OrderedItem) serializer.Combine(reader, oldOrderItem); } } Console.WriteLine("OldInstance:"); Write(oldOrderItem); Console.WriteLine("NewInstance:"); Write(newOrderItem); } private void Write(OrderedItem item) { Console.WriteLine(item.ItemName); Console.WriteLine(item.Description); Console.WriteLine(item.UnitPrice); Console.WriteLine(item.Quantity); Console.WriteLine(item.GetHashCode()); Console.WriteLine("-----"); } public class OrderedItem { public string Description; public string ItemName; public int Quantity; public decimal UnitPrice; } } }
<?xml version="1.0" encoding="utf-8" ?> <OrderedItem> <Description>Small Widget</Description> <Quantity>10</Quantity> <UnitPrice>2.30</UnitPrice> </OrderedItem>
输出内容如下:
OldInstance: Widgt Big Widget 4.7 0 21170186 ----- NewInstance: Widgt Small Widget 2.30 10 13134304 -----