Jul 24

C#类的克隆 不指定

kcao , 11:01 , 技术 , 评论(0) , 引用(0) , 阅读(2756) , Via 本站原创

 类成员要复制,用“=”只是添加一个reference,要真正的复制成员,正好能用上序列化。

先把类成员都标记序列化,然后使用如下代码即可。

C# Code Copy Code To Clipboard
  1. public MyClass Clone()  
  2. {  
  3.     MemoryStream stream = new MemoryStream();  
  4.     BinaryFormatter formatter = new BinaryFormatter();  
  5.     formatter.Serialize(stream, this);  
  6.     stream.Position = 0;  
  7.     return formatter.Deserialize(stream) as MyClass;  
  8. }  

调用时如下:

C# Code Copy Code To Clipboard
  1. MyClass newClass = new MyClass();  
  2. newClass = oldClass.Clone();  

即可生成一个与oldClass完全相同的newClass.

Tags: , , , ,
Jul 24

 C#中的默认Directory<>不支持序列化,也就是说无法用序列化方式把数据进行XML文件操作,要序列化,须对其进行改造如下:

C# Code Copy Code To Clipboard
  1. /// <summary>    
  2. /// 支持XML序列化的泛型 Dictionary    
  3. /// </summary>    
  4. /// <typeparam name="TKey"></typeparam>    
  5. /// <typeparam name="TValue"></typeparam>    
  6. [XmlRoot("SerializableDictionary")]  
  7. public class SerializableDictionary<TKey, TValue>  
  8.     : Dictionary<TKey, TValue>, IXmlSerializable  
  9. {   
  10.     #region 构造函数  
  11.     public SerializableDictionary()  
  12.         : base()  
  13.     {  
  14.     }  
  15.     public SerializableDictionary(IDictionary<TKey, TValue> dictionary)  
  16.         : base(dictionary)  
  17.     {  
  18.     }  
  19.   
  20.     public SerializableDictionary(IEqualityComparer<TKey> comparer)  
  21.         : base(comparer)  
  22.     {  
  23.     }  
  24.   
  25.     public SerializableDictionary(int capacity)  
  26.         : base(capacity)  
  27.     {  
  28.     }  
  29.     public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer)  
  30.         : base(capacity, comparer)  
  31.     {  
  32.     }  
  33.     protected SerializableDictionary(SerializationInfo info, StreamingContext context)  
  34.         : base(info, context)  
  35.     {  
  36.     }  
  37.     #endregion  
  38.     #region IXmlSerializable Members  
  39.     public System.Xml.Schema.XmlSchema GetSchema()  
  40.     {  
  41.         return null;  
  42.     }  
  43.     /// <summary>    
  44.     /// 从对象的 XML 表示形式生成该对象    
  45.     /// </summary>    
  46.     /// <param name="reader"></param>    
  47.     public void ReadXml(System.Xml.XmlReader reader)  
  48.     {  
  49.         XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));  
  50.         XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));  
  51.         bool wasEmpty = reader.IsEmptyElement;  
  52.         reader.Read();  
  53.         if (wasEmpty)  
  54.             return;  
  55.         while (reader.NodeType != System.Xml.XmlNodeType.EndElement)  
  56.         {  
  57.             reader.ReadStartElement("item");  
  58.             reader.ReadStartElement("key");  
  59.             TKey key = (TKey)keySerializer.Deserialize(reader);  
  60.             reader.ReadEndElement();  
  61.             reader.ReadStartElement("value");  
  62.             TValue value = (TValue)valueSerializer.Deserialize(reader);  
  63.             reader.ReadEndElement();  
  64.             this.Add(key, value);  
  65.             reader.ReadEndElement();  
  66.             reader.MoveToContent();  
  67.         }  
  68.         reader.ReadEndElement();  
  69.     }  
  70.   
  71.     /**/  
  72.     /// <summary>    
  73.     /// 将对象转换为其 XML 表示形式    
  74.     /// </summary>    
  75.     /// <param name="writer"></param>    
  76.     public void WriteXml(System.Xml.XmlWriter writer)  
  77.     {  
  78.         XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));  
  79.         XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));  
  80.         foreach (TKey key in this.Keys)  
  81.         {  
  82.             writer.WriteStartElement("item");  
  83.             writer.WriteStartElement("key");  
  84.             keySerializer.Serialize(writer, key);  
  85.             writer.WriteEndElement();  
  86.             writer.WriteStartElement("value");  
  87.             TValue value = this[key];  
  88.             valueSerializer.Serialize(writer, value);  
  89.             writer.WriteEndElement();  
  90.             writer.WriteEndElement();  
  91.         }  
  92.     }  
  93.     #endregion  
  94. }  

用此类型定义的Directory<>变量,可以如下进行存取:

C# Code Copy Code To Clipboard
  1. public void Save(string filename)  
  2. {  
  3.     System.IO.StreamWriter writer = new System.IO.StreamWriter(filename, false, System.Text.Encoding.UTF8);  
  4.     XmlSerializer ser = new XmlSerializer(MyClassInstanceName.GetType());   
  5.     ser.Serialize(writer, MyClassInstanceName);  
  6.     writer.Close();  
  7. }  
  8.   
  9. public MyClassName Load(string filename)  
  10. {  
  11.     System.IO.StreamReader reader = new System.IO.StreamReader(filename);  
  12.     XmlSerializer ser = new XmlSerializer(MyClassInstanceName.GetType());  
  13.     MyClassName result = new MyClassName ();  
  14.     result.MyClassInstanceName = (SerializableDictionary<string,int>)ser.Deserialize(reader);  
  15.     reader.Close();  
  16.     return result;  
  17. }  

 

Tags: , , , , ,
Jul 19

 把C#中的类用序列化保存/取出到XML文件,是很方便的事。

1. 要using命名空间:

C# Code Copy Code To Clipboard
  1. using System.Xml;  
  2. using System.Xml.Serialization;  
  3. using System.Runtime.Serialization;  

2. 要在类前加序列化标记,包括每个被成员类,都要加上:

C# Code Copy Code To Clipboard
  1. [Serializable]  
  2. [XmlRoot("UnitSystem")]  
  3. public class UnitSystem   
  4. {  
  5.     。。。。  
  6. }  

3. 需要保存的类的变量,包括子类中的变量,前面加上标记:

C# Code Copy Code To Clipboard
  1. 。。。  
  2. public class TUnitItem  
  3. {  
  4.     [XmlAttribute(AttributeName = "ParaA")]  
  5.     public double A;  
  6.     [XmlAttribute(AttributeName = "ParaB")]  
  7.     public double B;  
  8.     。。。  
  9. }  

4. 如果要保存的变量,是数组形式,加上如下标记:

C# Code Copy Code To Clipboard
  1. [XmlArray("Units")]  
  2. [XmlArrayItem("Unit")]  
  3. public List<TUnitItem> Units;  

5. 确保每个类,都有一个不带参数的构造方法:

C# Code Copy Code To Clipboard
  1. //这个实际上没用,只是为了序列化而建  
  2. public TUnitItem()  
  3. {  
  4.     UnitStr = "";  
  5.     A = 1;  
  6.     B = 0;  
  7. }  
  8. //这个才是真正用来构造类的  
  9. public TUnitItem(string Unitstr, double a, double b = 0)  
  10. {  
  11.     UnitStr = Unitstr;  
  12.     A = a;  
  13.     B = b;  
  14. }  

6. 然后,在你的类里,添加下面的函数用来保存、读取吧,我这里的类名是UnitSystem,改成你自己的即可:

C# Code Copy Code To Clipboard
  1. public void Save(string filename)  
  2. {  
  3.     System.IO.StreamWriter writer = new System.IO.StreamWriter(filename, false, System.Text.Encoding.UTF8);  
  4.     XmlSerializer ser = new XmlSerializer(GetType());  
  5.     ser.Serialize(writer, this);  
  6.     writer.Close();  
  7. }  
  8.   
  9. public void Load(string filename)  
  10. {  
  11.     System.IO.StreamReader reader = new System.IO.StreamReader(filename);  
  12.     XmlSerializer ser = new XmlSerializer(typeof(dbrcomponent));  
  13.     UnitSystem result = (UnitSystem)ser.Deserialize(reader);  
  14.     reader.Close();  
  15.     return result;  
  16. }  

 

 

Tags: , , ,
Jul 17

4年前用VS2005的C#编写了一个应用程序,用于调试VC++写的AMINE计算包。自从发布出去以后,就已经很久没有用过了。这两天有要求要重新改良一下这个软件,于是把这个程序移植到了VS2010,在Windows 7 64bit下重新编译通过,但是当运行case时,却发现出问题了。

界面每次调用DLL中的amDBRInitialize()进行初始化时,就报错。试了一下放在我的VM下的32bit的WIN7,XP下,也都会出这问题。但是在别人的windows XP下就是好的,在我另一台XP下也是好的。更奇怪的时,用以前vs2005编译的界面和DLL,也都存在同样的问题。

还好VS下抓错误信息很方便,错误为An attempt was made to load a program with an incorrect format.

查找后发现,这还是因为x86和x64兼容性的问题。因为dll是32位编译的,而编译界面时,无论以前的VS2005还是现在的VS2010,用的都是any cpu,结果在此64位计算机上,就出现了调用不谐调--64位的程序调用32位的DLL。所以,在VS2010上,把编译指令从ANY CPU改成X86就能解决问题。

修改以后,错误消失,这个问题算是解决了。但是奇怪的是,为什么之前在VM的32位的OS也一样不行呢?

Tags: , , , , , ,
Jul 17

美国车号称小毛病贼多,不过我这车开了6年,倒也没给我惹什么事。不过,这6年期刚过,毛病就来了。这不,突然某日发现后窗的雨刷不动弹了,雨刷就这样立在后窗,无论如何折腾开关,它都不左不右坚持不动摇。为人这样挺好,但是你是个雨刷哎,本来就应该左右摇摆不定的嘛。后来用力掰弄一下,得,这下它就左倾啦。

雨刷不动,这是病,得治。

这病挺好诊断,要不是控制电路问题,要不是马达问题。两者相比较,雨刷马达坏掉的可能性绝对更大。因此,就直接买了马达换上去吧。上rockauto找合适的马达,一看,呵呵,原来是bosch的啊,谁说德国货这好那好的来着,这不一样6年就死了。不废话,下单,等货。。。

到货。。。拆包之后先看看,这货样子真是怪怪的

反面:

嗯,博世出品,巴西制造。

现在,打开车后盖,拆之。先拆车后盖的把手上的镙钉,这里的是六角形螺丝刀。

这个卸了以后,整个后盖就松动了,但是还不能卸下来,因为左右还有两个橡皮块挡着,用气动扳手将它们也卸下。

然后用力往下一拽。。。哗啦一下,整块板就下来了。真简单啊。看,这就是里面的样子。

卸下的面板的一角,它通过这些突起以及上图中淡黄色的小圆片与门体连接。具体的下面装回去时说到。

现在可以看一下这个雨刷马达,它安装在这儿:

今天的任务就是要把它拆下来换掉。拆卸先从外面入手,所以,先把后门关起来。找到雨刷(-_-!!!),把后盖掀起来,没什么trick,直接就这样用手指头把它翻起来就是了。

然后,就可以看到藏在下面的螺母,

拆掉这个螺母后,把雨刷转出来。

然后,再把下面的电机固定螺母和防水盖拿走,外部的工作就完成了。防水盖记得有方向的,装回去时别装反了。

再把车门打开,把马达上的电源拔去,再松开两个固定螺栓,马达就可以拿下来了。

取下旧的,换上新的,记得别忘了把电源插回去,再试一下打开开关看看雨刷动不动。然后再上面反着来一遍把所有的螺丝螺母装回去就一切OK啦,但是且慢,装回一个马达容易,要把第一步拆下来的面原装回去,就不是那么简单啦。还记得第6张图里的那些淡黄色的小圆片么。要装回面板,首先得把这4个圆片拆下来,话说这4个家伙装得可真紧,把它们揪下来手都搞得好疼。

揪下来以后,要把它们放到面板上对应的卡槽里,让它们尖头冲上,插入刚才揪下来的孔里,你看这通折腾。。。

再然后,就可以把它装回去了。但是,在装回面板时,手还得进去拨弄一下,以使这些尖头能正好插入它们对应的孔。然而,俺这高度不够,车门全打开时翻得太高,俺无法从边缘把手伸进去给它拨乱反正。所以,就把这后门绑起来到半高位吧。

这样,俺就能指点它一下啦

面板都装回去了,其他的螺丝螺母便都是浮云啦。

DIY成功!换雨刷马达,成本一个电机,连运费大约80多美元,时间上由于没有经验,装回面板浪费了不少时间,共花了1个半小时。

Tags: , , , , , , , , , , ,
分页: 1/3 第一页 1 2 3 下页 最后页 [ 显示模式: 摘要 | 列表 ]