小编Gro*_*roo的帖子

如何在c#中将null数组反序列化为null?

这是我的班级:

public class Command
{
   [XmlArray(IsNullable = true)]
   public List<Parameter> To { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我序列化这个类的对象时:

var s = new XmlSerializer(typeof(Command));
s.Serialize(Console.Out, new Command());
Run Code Online (Sandbox Code Playgroud)

它按预期打印(省略xml标头和默认MS名称空间):

<Command><To xsi:nil="true" /></Command>
Run Code Online (Sandbox Code Playgroud)

当我拿这个xml并试图反序列化它时我被卡住了,因为它总是打印"Not null":

var t = s.Deserialize(...);
if (t.To == null)
    Console.WriteLine("Null");
else
    Console.WriteLine("Not null");
Run Code Online (Sandbox Code Playgroud)

如果强制反序列化器使我的列表为null,如果它在xml中为null?

c# xml arrays serialization nullable

11
推荐指数
2
解决办法
2512
查看次数

我们应该对数据库进行非规范化以提高性能吗

我们要求每秒存储500次测量,来自多个设备.每个度量由时间戳,数量类型和几个向量值组成.现在每次测量有8个矢量值,我们可能会认为这个数字对于原型项目的需求是恒定的.我们正在使用HNibernate.测试是在SQLite(磁盘文件db,而不是内存)中完成的,但生产可能是MsSQL.

我们的Measurement实体类是包含单个度量的类,如下所示:

public class Measurement
{
    public virtual Guid Id { get; private set; }
    public virtual Device Device { get; private set; }
    public virtual Timestamp Timestamp { get; private set; }
    public virtual IList<VectorValue> Vectors { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

矢量值存储在单独的表中,以便它们中的每一个通过外键引用其父测量值.

我们已经做了几件事情,以确保生成的SQL(合理)高效:我们正在使用Guid.Comb生成的ID,我们正在冲洗在一个事务中约500项,ADO.Net批量大小设置为100(我认为SQLIte不支持批量更新?但以后可能会有用).

问题

现在我们可以每秒插入150-200个测量值(这还不够快,尽管这是我们正在讨论的SQLite).查看生成的SQL,我们可以看到在单个事务中插入(按预期):

  • 1个时间戳
  • 1测量
  • 8个矢量值

这意味着我们实际上要多做10倍的单表插入:每秒1500-2000.

如果我们将所有内容(所有8个向量值和时间戳)放入测量表(添加9个专用列),似乎我们可以将插入速度提高10倍.

切换到SQL服务器将提高性能,但我们想知道是否有办法避免与数据库组织方式相关的不必要的性能成本.

[编辑]

对于内存中的SQLite,我得到大约350项/秒(3500个单表插入),我相信它与NHibernate一样好(以此帖子作为参考:http://ayende.com/Blog/archive/ 2009/08/22/nhibernate-perf-tricks.aspx).

但我不妨切换到SQL服务器并停止假设,对吧?我会在测试后立即更新我的帖子.

[更新]

我已经转移到SQL服务器并使我的层次结构扁平化,我通过存储3000次测量/秒几个小时来测试它,它似乎工作正常.

.net sqlite nhibernate database-design database-normalization

11
推荐指数
1
解决办法
1727
查看次数

启用放大移动网站

我正在开发一个移动网站.但缩放效果在我的页面上不起作用.我在页面中使用了以下标记.

<meta name="viewport" 
      content="width=device-width, minimum-scale=1.0, maximum-scale=1.0" />
Run Code Online (Sandbox Code Playgroud)

我想知道:

  1. 是否可以使用此标记获得缩放效果以及如何以正确的方式使用它?

  2. 我还可以用于此目的吗?

  3. 我们的客户群主要在iPhone上.在为iPhone用户开发移动网站时,是否应该考虑/使用特殊的东西/技术?

iphone mobile

10
推荐指数
1
解决办法
8223
查看次数

流畅的NHibernate +多个数据库

我的项目需要处理三个数据库,这意味着三个会话工厂.问题是如果我用流利的nhibernate做这样的事情:

.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
Run Code Online (Sandbox Code Playgroud)

工厂将获取所有映射,甚至是与另一个数据库相对应的映射

我已经看到,当使用自动化时,您可以执行类似的操作,并按命名空间过滤:

.Mappings(m => m.AutoMappings.Add(
    AutoMap
       .AssemblyOf<Product>()
       .Where(t => t.Namespace == "Storefront.Entities")))
Run Code Online (Sandbox Code Playgroud)

我没有找到这样的流利映射,是否有可能?我能想到的唯一解决方案是:为每个db映射类创建单独的程序集,或者将每个实体显式添加到工厂配置中.

如果可能的话,我宁愿避免这两种情况.谢谢.

.net nhibernate nhibernate-mapping fluent-nhibernate

9
推荐指数
2
解决办法
5965
查看次数

从c ++ DLL和c#发布SAFEARRAY

我有一个c ++函数来获取数据,我从c#调用它.该函数获取一个指向SAFEARRAY的指针并用字符串弹出它(使用SysAllocString)

一切都很好,但程序泄漏了内存.

我做了一点搜索,发现如果我将此属性添加到方法签名:

 [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
 out string[] strServerList
Run Code Online (Sandbox Code Playgroud)

我需要在c ++代码中释放它(它被分配),所以我创建了这个函数

 [DllImport("Native.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "DeallocateExternal")]
 internal static extern void DeallocateExternal(
 [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
 out string[] strServerList);
Run Code Online (Sandbox Code Playgroud)

在我的DLL中我写了这段代码

void DeallocateExternal(SAFEARRAY** psa)
{
    LONG cDims = SafeArrayGetDim(*psa);
    BSTR* pvData = (BSTR*)((*psa)->pvData); 
    for (LONG x = 0; x < cDims; x++)
    {
       SysFreeString(pvData[x]);
    }
    SafeArrayDestroy(*psa); 
}
Run Code Online (Sandbox Code Playgroud)

但我有一个例外:

Tester.exe中发生了未处理的"System.AccessViolationException"类型异常

附加信息:尝试读取或写入受保护的内存.这通常表明其他内存已损坏.

怎么了?

c# c++ memory interop safearray

9
推荐指数
1
解决办法
2918
查看次数

方法隐藏如何在C#中起作用?

为什么打印以下程序

B
B
Run Code Online (Sandbox Code Playgroud)

(正如它应该)

public class A
    {
        public void Print()
        {
            Console.WriteLine("A");
        }
    }

    public class B : A
    {
        public new void Print()
        {
            Console.WriteLine("B");
        }

        public void Print2()
        {
            Print();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var b = new B();
            b.Print();
            b.Print2();
        }
    }
Run Code Online (Sandbox Code Playgroud)

但如果我们删除B类中的关键字'public',就像这样:

    new void Print()
    {
        Console.WriteLine("B");
    }
Run Code Online (Sandbox Code Playgroud)

它开始打印

A
B
Run Code Online (Sandbox Code Playgroud)

c# compiler-construction inheritance method-hiding

8
推荐指数
2
解决办法
472
查看次数

具有32/64位驱动程序的单个32位MSI

是否可以在相同的WiX设置中包含difxapp_ x86 .wixlib或difxapp_ x64 .wixlib,以便在32位和64位计算机上安装驱动程序?

背景是我们有一个设置,无论目标平台如何都需要32位(它是一个使用32位COM组件的.NET应用程序,因此我们必须将.Net程序集构建为x86).

所以最后MSI源文件没有区别,除了64位机器需要difxapp_x64.wixlib来正确安装驱动程序,似乎我仍然需要为32/64创建两个独立的32位MSI文件比特平台.这看起来好吗?

.net com 64-bit wix driver

8
推荐指数
1
解决办法
1043
查看次数

SQLite程序集未复制到输出文件夹以进行单元测试

问题:进行单元测试时,我的DAL程序集中引用的SQLite程序集不会被复制到输出文件夹(Copy local设置为true).

我正在使用VS2008中的.Net 3.5应用程序,在我的DAL中使用NHibernate和SQLite.数据访问通过IRepository接口(存储库工厂)公开给其他层,因此不需要引用其他层中NHibernateSystem.Data.SQLite程序集.

对于单元测试,有一个公共工厂方法(也在我的DAL中),它创建一个内存中的SQLite会话并创建一个新的IRepository实现.这样做也是为了避免为需要它的所有程序集提供共享的SQLite内存配置,并避免引用这些DAL内部程序集.

问题是当我运行单独项目的单元测试时 - 如果我不添加System.Data.SQLite作为单元测试项目的引用,它不会被复制到TestResults ...\Out文件夹(虽然这个项目引用了我的引用的DAL项目,System.Data.SQLite其Copy本地属性设置为true),因此在配置NHibernate时测试失败.如果我添加对我的测试项目的引用,那么它会被复制并且单元测试工作.

我究竟做错了什么?

[更新]

看来我在这里找到了答案:TFS UnitTesting在构建服务器上没有部署本地副本程序集来测试目录.如果我在DAL中的某个静态方法中添加对该类型的引用,那么当我在测试中引用DAL程序集时,它将自动复制.这似乎是一个黑客,但恕我直言是一个更清洁的解决方案,而不是单独的脚本,因为它创建一个"真正的"依赖.

看来,如果我添加了SQLite的组件作为一个额外的部署项目到我的测试运行配置(LocalTestRun.testrunco​​nfig文件)也被复制.

谢谢你的快速解答!

.net nhibernate unit-testing system.data.sqlite

8
推荐指数
1
解决办法
1074
查看次数

PHP扩展使用libtidy编译,但不加载

我在C++中编写了一个使用libtidy的扩展,当我编译PHP时它在PHP下完美运行--with-tidy.

但是,将扩展程序运行在一个vanilla PHP上会很不错.当我尝试使用扩展时,我得到类似的东西:

PHP Warning:   
  PHP Startup: 
    Unable to load dynamic library 'extension.so': 
      undefined symbol: tidyCleanAndRepair in Unknown on line 0

并且未加载扩展名.

显然,官方整洁的扩展工作正常.我在系统上安装了相关的libtidy开发包,它编译+链接没有问题.我试图通过代码查看整洁的扩展,但它是一个巨大的宏 - 复制件随机感觉像货物代码.

除了链接到库PHP_ADD_LIBRARY_WITH_PATH(tidy, $TIDY_LIBDIR, TIDY_SHARED_LIBADD),是否有PHP扩展或C语句来修复此错误?

提前致谢!!

编辑:这是整个config.m4文件:

dnl config.m4 for extension htmlparser

PHP_ARG_ENABLE(htmlparse, whether to enable htmlparser support,
 [  --enable-htmlparser           Enable htmlparser support])

if test "$PHP_HTMLPARSER" != "no"; then


  if test -r $PHP_LIBXML2/lib/libxml2.a; then
    LIBXML2_DIR=$PHP_LIBXML2
  else
    AC_MSG_CHECKING(for libxml2 in default path)
    for i in /usr/local /usr; do
      if test -r $i/lib/libxml2.a; then
        LIBXML2_DIR=$i …
Run Code Online (Sandbox Code Playgroud)

php linux tidy php-extension

8
推荐指数
1
解决办法
1121
查看次数

在lambda表达式的子句中

var Charts = chartGroup
     .Descendants("charts")
     .Elements("chart")
     .Where(x => x.Attribute("id").Value == chartId.ToString())
     .Select(x => x.Attribute("name").Value).ToList();
Run Code Online (Sandbox Code Playgroud)

在这里,我想使用"in-clause"(如inSQL中的子句)来Attribute("id").Value表示字符串数组:

喜欢:

Where(x => x.Attribute("id").Value in ("1","2")
Where(x => x.Attribute("id").Value` in charIds[]
Run Code Online (Sandbox Code Playgroud)

怎么实现这个?

c# linq lambda

8
推荐指数
1
解决办法
3万
查看次数