类成员要复制,用“=”只是添加一个reference,要真正的复制成员,正好能用上序列化。
先把类成员都标记序列化,然后使用如下代码即可。
- public MyClass Clone()
- {
- MemoryStream stream = new MemoryStream();
- BinaryFormatter formatter = new BinaryFormatter();
- formatter.Serialize(stream, this);
- stream.Position = 0;
- return formatter.Deserialize(stream) as MyClass;
- }
调用时如下:
- MyClass newClass = new MyClass();
- newClass = oldClass.Clone();
即可生成一个与oldClass完全相同的newClass.
C#中的默认Directory<>不支持序列化,也就是说无法用序列化方式把数据进行XML文件操作,要序列化,须对其进行改造如下:
- /// <summary>
- /// 支持XML序列化的泛型 Dictionary
- /// </summary>
- /// <typeparam name="TKey"></typeparam>
- /// <typeparam name="TValue"></typeparam>
- [XmlRoot("SerializableDictionary")]
- public class SerializableDictionary<TKey, TValue>
- : Dictionary<TKey, TValue>, IXmlSerializable
- {
- #region 构造函数
- public SerializableDictionary()
- : base()
- {
- }
- public SerializableDictionary(IDictionary<TKey, TValue> dictionary)
- : base(dictionary)
- {
- }
- public SerializableDictionary(IEqualityComparer<TKey> comparer)
- : base(comparer)
- {
- }
- public SerializableDictionary(int capacity)
- : base(capacity)
- {
- }
- public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer)
- : base(capacity, comparer)
- {
- }
- protected SerializableDictionary(SerializationInfo info, StreamingContext context)
- : base(info, context)
- {
- }
- #endregion
- #region IXmlSerializable Members
- public System.Xml.Schema.XmlSchema GetSchema()
- {
- return null;
- }
- /// <summary>
- /// 从对象的 XML 表示形式生成该对象
- /// </summary>
- /// <param name="reader"></param>
- public void ReadXml(System.Xml.XmlReader reader)
- {
- XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
- XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
- bool wasEmpty = reader.IsEmptyElement;
- reader.Read();
- if (wasEmpty)
- return;
- while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
- {
- reader.ReadStartElement("item");
- reader.ReadStartElement("key");
- TKey key = (TKey)keySerializer.Deserialize(reader);
- reader.ReadEndElement();
- reader.ReadStartElement("value");
- TValue value = (TValue)valueSerializer.Deserialize(reader);
- reader.ReadEndElement();
- this.Add(key, value);
- reader.ReadEndElement();
- reader.MoveToContent();
- }
- reader.ReadEndElement();
- }
- /**/
- /// <summary>
- /// 将对象转换为其 XML 表示形式
- /// </summary>
- /// <param name="writer"></param>
- public void WriteXml(System.Xml.XmlWriter writer)
- {
- XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
- XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
- foreach (TKey key in this.Keys)
- {
- writer.WriteStartElement("item");
- writer.WriteStartElement("key");
- keySerializer.Serialize(writer, key);
- writer.WriteEndElement();
- writer.WriteStartElement("value");
- TValue value = this[key];
- valueSerializer.Serialize(writer, value);
- writer.WriteEndElement();
- writer.WriteEndElement();
- }
- }
- #endregion
- }
用此类型定义的Directory<>变量,可以如下进行存取:
- public void Save(string filename)
- {
- System.IO.StreamWriter writer = new System.IO.StreamWriter(filename, false, System.Text.Encoding.UTF8);
- XmlSerializer ser = new XmlSerializer(MyClassInstanceName.GetType());
- ser.Serialize(writer, MyClassInstanceName);
- writer.Close();
- }
- public MyClassName Load(string filename)
- {
- System.IO.StreamReader reader = new System.IO.StreamReader(filename);
- XmlSerializer ser = new XmlSerializer(MyClassInstanceName.GetType());
- MyClassName result = new MyClassName ();
- result.MyClassInstanceName = (SerializableDictionary<string,int>)ser.Deserialize(reader);
- reader.Close();
- return result;
- }
把C#中的类用序列化保存/取出到XML文件,是很方便的事。
1. 要using命名空间:
- using System.Xml;
- using System.Xml.Serialization;
- using System.Runtime.Serialization;
2. 要在类前加序列化标记,包括每个被成员类,都要加上:
- [Serializable]
- [XmlRoot("UnitSystem")]
- public class UnitSystem
- {
- 。。。。
- }
3. 需要保存的类的变量,包括子类中的变量,前面加上标记:
- 。。。
- public class TUnitItem
- {
- [XmlAttribute(AttributeName = "ParaA")]
- public double A;
- [XmlAttribute(AttributeName = "ParaB")]
- public double B;
- 。。。
- }
4. 如果要保存的变量,是数组形式,加上如下标记:
- [XmlArray("Units")]
- [XmlArrayItem("Unit")]
- public List<TUnitItem> Units;
5. 确保每个类,都有一个不带参数的构造方法:
- //这个实际上没用,只是为了序列化而建
- public TUnitItem()
- {
- UnitStr = "";
- A = 1;
- B = 0;
- }
- //这个才是真正用来构造类的
- public TUnitItem(string Unitstr, double a, double b = 0)
- {
- UnitStr = Unitstr;
- A = a;
- B = b;
- }
6. 然后,在你的类里,添加下面的函数用来保存、读取吧,我这里的类名是UnitSystem,改成你自己的即可:
- public void Save(string filename)
- {
- System.IO.StreamWriter writer = new System.IO.StreamWriter(filename, false, System.Text.Encoding.UTF8);
- XmlSerializer ser = new XmlSerializer(GetType());
- ser.Serialize(writer, this);
- writer.Close();
- }
- public void Load(string filename)
- {
- System.IO.StreamReader reader = new System.IO.StreamReader(filename);
- XmlSerializer ser = new XmlSerializer(typeof(dbrcomponent));
- UnitSystem result = (UnitSystem)ser.Deserialize(reader);
- reader.Close();
- return result;
- }
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也一样不行呢?
美国车号称小毛病贼多,不过我这车开了6年,倒也没给我惹什么事。不过,这6年期刚过,毛病就来了。这不,突然某日发现后窗的雨刷不动弹了,雨刷就这样立在后窗,无论如何折腾开关,它都不左不右坚持不动摇。为人这样挺好,但是你是个雨刷哎,本来就应该左右摇摆不定的嘛。后来用力掰弄一下,得,这下它就左倾啦。

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

反面:

嗯,博世出品,巴西制造。
现在,打开车后盖,拆之。先拆车后盖的把手上的镙钉,这里的是六角形螺丝刀。
这个卸了以后,整个后盖就松动了,但是还不能卸下来,因为左右还有两个橡皮块挡着,用气动扳手将它们也卸下。

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

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

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

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

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

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

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


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


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

揪下来以后,要把它们放到面板上对应的卡槽里,让它们尖头冲上,插入刚才揪下来的孔里,你看这通折腾。。。
.jpg)
.jpg)
再然后,就可以把它装回去了。但是,在装回面板时,手还得进去拨弄一下,以使这些尖头能正好插入它们对应的孔。然而,俺这高度不够,车门全打开时翻得太高,俺无法从边缘把手伸进去给它拨乱反正。所以,就把这后门绑起来到半高位吧。

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

面板都装回去了,其他的螺丝螺母便都是浮云啦。
DIY成功!换雨刷马达,成本一个电机,连运费大约80多美元,时间上由于没有经验,装回面板浪费了不少时间,共花了1个半小时。




