在C#中,如何在不XmlSerializer事先知道类型的情况下使用an 反序列化可能是基类的对象,或者反序列化任何几个派生类?
我的所有派生类都添加了其他数据成员.我已经制作了一个简单的GUI,可以序列化和反序列化类对象.它将序列化对象,因为任何继承的类(甚至只是基类)都适合于用户选择填充的字段.
我对序列化没有任何问题; 问题是反序列化.如何XmlSerializer在不事先知道类的情况下将反序列化数据传递给正确的派生类?我目前创建一个XmlReader读取XML文件的第一个节点并从中确定类,它似乎适用于我的目的,但它似乎是一个非常不优雅的解决方案.
我在下面发布了一些示例代码.有什么建议?
BaseType objectOfConcern = new BaseType();
XmlSerializer xserializer;
XmlTextReader xtextreader = new XmlTextReader(DEFAULT_FILENAME);
do { xtextreader.Read(); } while (xtextreader.NodeType != XmlNodeType.Element);
string objectType = xtextreader.Name;
xtextreader.Close();
FileStream fstream = new FileStream(DEFAULT_FILENAME, FileMode.Open);
switch (objectType)
{
case "type1":
xserializer = new XmlSerializer(typeof(DerivedType));
objectOfConcern = (DerivedType)xserializer.Deserialize(fstream);
//Load fields specific to that derived type here
whatever = (objectOfConcern as DerivedType).NoOfstreamubordinates.ToString();
case "xxx_1":
//code here
case "xxx_2":
//code here
case "xxx_n":
//code here …Run Code Online (Sandbox Code Playgroud) 我最近不得不在Ubuntu系统上做一些小编程(我是一个非常低级的初学者)而且我真的只是熟悉makefile.
我注意到告诉链接器要包含哪些库的参数总是-l {library name},其中相应的库在/ usr/lib文件夹中称为"lib {library name} .a".
我想知道:这是一个会议吗?我原以为我需要输入-llibNAME来查找一个名为libNAME.a的库,但它似乎假设一个lib前缀.
总是这样吗?我可以在不使用lib前缀的情况下命名库吗?
我最近使用的Visual Studio 2008项目遇到了一个奇怪的问题.
我正在尝试编译一个新的静态库,它使用另一个静态库中的函数.(假设Lib1是我的静态库项目,而Lib2是Lib1依赖的lib文件).
我可以毫无问题地构建lib1; 它包含lib2的头文件并调用它的函数,没有任何问题.
问题是当我构建一个以Lib1作为依赖项的单独测试项目时; 它不会构建,我会收到链接器错误.未解析的外部是我试图在Lib1中调用来自Lib2的函数.
当我在我的测试项目中包含Lib2时,这一切都已修复.
这当然对我有意义; 我可以测试Lib2没有内置到Lib1 ..
我的问题是:有没有办法做到这一点?理想情况下,我希望能够将Lib1部署为独立的lib而不需要Lib2.(Lib2实际上只是来自Windows平台SDK的Lib,所以它并不是什么大不了的......)
这是不允许的,因为它允许人们"隐藏"他们自己的第三方图书馆,或者什么?
什么是这个问题的专业方法?
谢谢!
--R
在我公司,我们经常在CPU压力下测试USB和FireWire设备的性能.
我们运行的测试代码可以加载CPU,它通常用于非常简单的非正式测试,以查看设备性能的变化.
我看了一下这个代码,它是一个简单的循环,它递增一个计数器并根据新值进行计算,将这个结果存储在另一个变量中.
运行单个实例将使用CPU的1/X,其中X是核心数.
因此,例如,如果我们使用的是8核PC,并且我们希望看到我们的设备如何在50%的CPU使用率下运行,我们可以同时打开四个这样的实例,依此类推......
我在想:
是什么决定了CPU耗尽了多少?它是否只是在单线程应用程序中的单个线程上以尽可能快的速度运行所有内容?
有没有办法自愿限制程序可以使用的最大CPU使用率?我可以想到一些"草率"的方式(添加睡眠命令或其他东西),但有没有办法限制说,某些指定百分比的可用CPU或什么?
我正在为一个网站制作一个模板,我遇到了一些非常基本的CSS问题.
基本上,我试图将网站划分为使用div元素的部分,我希望每个部分都包含一个半透明的黑色背景,周围有完全透明的边框.
这个想法是有一个背景图像,并且会有新闻项目分成黑色块,这些块实际上并没有相互接触或重叠(也就是说,它们周围有边缘).黑块稍微看穿和它们之间的区域(这将是大小几个像素)是空的内容,你可以直接看到背景.
我到目前为止的内容如下:
网站:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="mainPage.css" />
<title>Some site</title>
</head>
<body>
<div class="container">
<div class="header">
<img src="images/SomeImage.bmp" alt="ImageName"/>
</div>
<div class="latestBlockLeft">
<div class="transDiv">
<p> latestBlockLeft1 </p>
</div>
</div>
<div class="randomBlockRight">
<h1> Heading test</h1>
<p> randomBlockRight </p>
</div>
<div class="latestBlockLeft">
<div class="transDiv">
<p> latestBlockLeft2 </p>
</div>
</div>
<div class="latestBlockLeft">
<div class="transDiv">
<p> latestBlockLeft3 </p>
</div>
</div>
<div class="menuStrip">
<p> menuStrip </p>
</div>
<div class="sectionedNews">
<p> sectionedNews </p>
</div>
<div class="disclaimer">
<p> disclaimer …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个Windows应用程序,该应用程序可以为我提供给定特定键的所有子键和值。我编写的代码似乎可以在给定键中提供子键的范围内正常工作,但不能正确枚举值。它成功枚举了没有值的子项,并以选项卡式树的形式返回了结果。但是,在枚举值时,程序会为存在的每个值返回一个随机值(每次都相同的随机值),然后由于调试错误而崩溃。
预期的输出基本上是:
(1) KEY
(1) SUBKEY
(1) SUBKEYWITHINSUBKEY
Code: value1data
Code: value2data
Code: value3data
(2) SUBKEY
(1) SUBKEYWITHINSUBKEY
(3) SUBKEY
Run Code Online (Sandbox Code Playgroud)
...等等。
相反,我得到的输出是这样的:
(1) KEY
(1) SUBKEY
(1) SUBKEYWITHINSUBKEY
Code: someValue
Code: someValue
Code: someValue
Run Code Online (Sandbox Code Playgroud)
(...然后是崩溃)
,然后出现以下错误:
“调试错误!”运行时检查失败#2-变量'valNameLen'周围的堆栈已损坏。
目前的代码有点混乱(我是Windows API新手),但是如果有人可以告诉我我做错了什么,或者以任何他们认为合适的方式批评我的编码风格,那将是很棒的。
谢谢!
-R
/*
Windows Registry Subkey Enumeration Example
Based on example found at code-blue.org
*/
#include <windows.h>
#include <stdio.h>
void EnumerateValues(HKEY hKey, DWORD numValues)
{
DWORD dwIndex = 0;
LPSTR valueName = new CHAR[64];
DWORD valNameLen;
DWORD dataType;
DWORD data;
DWORD …Run Code Online (Sandbox Code Playgroud) 我有一个使用 PowerShell 查询系统信息的 C# 测试应用程序的代码,其中有一些简单的函数,如下所示:
public void GetSystemInfo()
{
using (PowerShell ps = PowerShell.Create())
{
ps.AddCommand("Get-Disk"); // Get-Disk is an example; this varies
foreach (PSObject result in ps.Invoke())
{
// ...
// Do work here. Process results, etc...
// ...
}
}
}
Run Code Online (Sandbox Code Playgroud)
这很简单,主要取自 MSDN 示例,如下所示: https: //msdn.microsoft.com/en-us/library/dd182449(v =vs.85).aspx
问题是,每次调用此函数时,我都可以看到应用程序的内存占用量增加。占用空间在调用 ps.Invoke() 时立即增大,并且永远不会缩小。我如何处理数据并不重要;重要的是。我什至可以完全注释掉 foreach 循环的主体,并且内存永远不会被垃圾收集。
据我从查看 PowerShell 类接口来看,似乎没有办法强制它自行清理,并且 Dispose() 显然不起作用,因为在使用后资源仍然在内存中泄漏阻止出口。
这是 C# PowerShell 类实现或 PowerShell 本身的已知错误吗?有谁知道解决方案,或者如果可能的话有替代方案吗?
我现在也尝试了以下方法,得到了相同的结果:
public void GetSystemInfo()
{
Runspace rs = RunspaceFactory.CreateRunspace();
rs.Open();
PowerShell ps …Run Code Online (Sandbox Code Playgroud) 我的大部分编程知识都是自学成才的,所以我从来没有教过适当的设计模式,约定等等.
我最近一直在挖掘我公司的许多软件库,我注意到很多班级数据成员都在他们的名字中有下划线.
例如:
class Image
{
// various things
// data members
char* _data;
ImageSettings* _imageSettings;
// (and so on...)
};
Run Code Online (Sandbox Code Playgroud)
我在很多在线示例代码中都看到了这一点.这个惯例背后有原因吗?对不起,我无法提供更好的例子,我真的想记住我的头脑,但我看到了很多.
我知道匈牙利符号,但我试图掌握用于C++ OOP编程的所有其他约定.
我知道在DOS/Windows应用程序中,您可以使用如下行来从代码发出系统命令:
system("pause");
Run Code Online (Sandbox Code Playgroud)
要么
system("myProgram.exe");
Run Code Online (Sandbox Code Playgroud)
......来自stdlib.h.是否有类似的Linux命令,如果是这样,我会找到哪个头文件?
此外,这被认为是糟糕的编程习惯吗?我正在考虑使用该lsmod命令获取加载的内核模块列表.这是个好主意还是坏主意?我发现一些网站似乎以负面的方式查看系统调用(至少是系统("暂停");).
我想使用数组初始化程序从另一个字节数组中构建一个字节数组,以及构成标题/尾部的其他一些字节.基本上,我想做这样的事情:
byte[] DecorateByteArray(byte[] payload)
{
return new byte[] { 0, 1, 2, payload.GetBytes(), 3, 4, 5};
}
Run Code Online (Sandbox Code Playgroud)
GetBytes() 不幸的是,上面是虚构的.
这有什么好的/优雅的方式吗?我通过使用a BinaryWriter将所有内容写入a MemoryStream,然后将其转换为字节数组来解决这个问题MemoryStream.ToArray(),但它感觉有点笨重.