C#转VB.NET时无法理解XML中NIC Profile写入逻辑求助
问题
我正在尝试将C#程序 SwitchNetConfig 改写为Visual Basic.NET版本,目前所有功能均正常,仅无法实现将每个配置文件对应的IP配置(IP、子网掩码、网关、DNS)写入XML的功能。
据我所知,该程序调用ConfigurationHelper.cs中的saveConfig()方法保存配置,但我始终未搞清楚程序写入NIC配置文件的逻辑。我目前已可以成功创建文件并写入配置文件名称,但无法写入对应的NIC配置信息。
我想知道这段代码中是哪个部分负责写入每个配置文件对应的NIC配置?
对应给出的SaveConfig方法代码如下:
public static void SaveConfig( ArrayList profiles ) { // Use XML Serializer to serialize the content of the specified array list XmlSerializer serializer = new XmlSerializer( typeof( ConfigWrapper ) ); // open the profile file StreamWriter writer = new StreamWriter( PROFILE_FILE_NAME, false ); try { ConfigWrapper wrapper = new ConfigWrapper(); wrapper.Profiles = profiles; // Serialize the array list to the file serializer.Serialize( writer.BaseStream, wrapper ); } catch( Exception x ) { System.Diagnostics.Debug.WriteLine( x.Message ); } // close the file writer.Close(); }
解答
你贴出的SaveConfig方法本身不负责逐字段写入NIC配置,它只是调用.NET内置的XML序列化器完成对象到XML的输出,真正控制哪些NIC配置字段会被写入XML的是两个和序列化相关的类定义,和SaveConfig方法里的逻辑无关:
- 首先是
ConfigWrapper类:它是XML序列化的根容器,序列化器只会识别它公开的可读写属性,你需要确认你转写的VB版本中,这个类的Profiles属性是正确的公共可读写属性,没有加XmlIgnore之类的排除序列化的标记。 - 其次是
Profiles集合中存储的单个网卡配置类(一般命名为Profile或者类似名称):你现在能写入配置文件名、写不进IP/子网掩码/网关/DNS,几乎都是转写这个类的时候出了问题。.NET的XmlSerializer有严格的序列化规则:只会序列化公共的、同时包含get和set访问器的属性,私有字段、只读属性、内部变量都不会被写入XML。
你可以对照原C#代码里的单个Profile类逐一核对:
- IP、Subnet、Gateway、DNS这几个成员是否都定义为带
Get/Set的公共属性 - 这几个属性有没有加错序列化特性,比如误加了
XmlIgnore,或者原代码里的XmlElement自定义标记漏写 - 存入
profiles集合的实例中,这几个字段是否确实被赋值,没有传入空值
你代码里的serializer.Serialize(writer.BaseStream, wrapper);只是触发序列化的动作,本身没有任何逐字段写配置的逻辑,最终写入XML的内容完全由你传给序列化器的两个类的结构定义决定。
内容的提问来源于stack exchange,提问作者Shahrul Amir
相关产品推荐
相关产品推荐

