小编Cit*_*iew的帖子

不可打印字符的序列化

以下代码;

var c = (char) 1;

var serializer = new XmlSerializer(typeof (string));

var writer = new StringWriter();
serializer.Serialize(writer, c.ToString()); 
var serialized = writer.ToString();

var dc = serializer.Deserialize(new StringReader(serialized));
Run Code Online (Sandbox Code Playgroud)

在.NET 4中引发此异常.

无效的操作异常 - XML文档中存在错误(2,12).'',十六进制值0x01,是无效字符.第2行,第12位

难道我做错了什么?或者有合理的解决方法吗?

非常感谢!

.net c# serialization xml-serialization .net-4.0

13
推荐指数
2
解决办法
2937
查看次数

自定义ObservableCollection <T>或BindingList <T>,支持定期通知

摘要

我有一个快速变化的大型数据集,我希望将其绑定到UI(带有分组的Datagrid).这些变化分为两个层次;

  • 经常在集合中添加或删除项目(单程500秒)
  • 每个项目都有4个属性,在其生命周期中最多可更改5次

数据的特征如下;

  • 该系列共有约5​​000件商品
  • 可以在一秒内添加项目,然后进行5次属性更改,然后将其删除.
  • 项目也可能暂时保持某种临时状态,并应显示给用户.

我遇到问题的关键要求;

  • 用户应该能够通过对象上的任何属性对数据集进行排序

我想做什么;

  • N秒更新一次UI
  • 仅引发相关的NotifyPropertyChangedEvents

如果第1项具有属性状态,该状态从A - > B - > C - > D移动到我需要/仅想要引发一个"状态"改变事件的区间中,A-> D.

我感谢用户不需要每秒更新数千次UI.如果添加了一个项目,其状态已更改并在UI更新之间的N秒窗口内全部删除,则它永远不会访问DataGrid.

数据网格

DataGrid是我用来显示数据的组件.我目前正在使用XCeed DataGrid,因为它提供了简单的动态分组.我没有在情感上投入其中,如果我可以提供一些动态分组选项(其中包括经常更改的属性),那么股票DataGrid会很好.

我的系统中的瓶颈目前是在项目属性发生变化时重新排序所花费的时间

这占用了YourKit Profiler中98%的CPU.

用不同的方式来表达问题

给定两个BindingList/ObservableCollection实例,这些实例最初相同,但第一个列表已经有一系列额外的更新(您可以监听),生成最小的更改集以将一个列表转换为另一个列表.

外部阅读

我需要的是George Tryfonas 的这个ArrayMonitor的等价物,但是通用它来支持添加和删除项目(它们永远不会被移动).

NB我真的很感谢有人编辑问题的标题,如果他们能想到更好的总结.

编辑 - 我的解决方案

XCeed网格将单元格直接绑定到网格中的项目,而排序和分组功能由BindingList上引发的ListChangedEvents驱动.这有点直观,并排除了下面的MontioredBindingList,因为行将在组之前更新.

相反,我自己包装项目,捕获属性更改事件并将其存储在HashSet中,如Daniel建议的那样.这对我很有用,我会定期迭代这些项目并要求他们通知任何更改.

MonitoredBindingList.cs

这是我对绑定列表的尝试,可以轮询更新通知.可能有一些错误,因为它最终对我没用.

它创建一个添加/删除事件队列,并通过列表跟踪更改.ChangeList与基础列表具有相同的顺序,因此在我们通知添加/删除操作后,您可以针对正确的索引引发更改.

/// <summary>
///  A binding list which allows change events to be polled rather than pushed.
/// </summary>
[Serializable]

public class MonitoredBindingList<T> : BindingList<T>
{
    private readonly object publishingLock = …
Run Code Online (Sandbox Code Playgroud)

c# wpf large-data-volumes bindinglist observablecollection

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

C# - 如何在无法附加调试器后继续 - System.Diagnostics.Debugger.Launch()

我通过将'-d'作为命令行参数传递给我的控制台应用程序来附加调试器.这会导致调用以下代码;

bool attachedDebugger = false;
try
{
   attachedDebugger = System.Diagnostics.Debugger.Launch();
}
catch (Exception) { }
finally
{
   Console.WriteLine(attachedDebugger ? "Debugger Attached" : "Failed to attach debugger");
}
Run Code Online (Sandbox Code Playgroud)

弹出Visual Studio 2010 JIT窗口后,我有时会改变主意,不想调试,所以我忽略了对话框.如果我没有附加一个,那么应用程序会立即退出而不会将任何内容写入控制台.

我知道这是一个边缘用例,如果我不想调试,我应该从命令行中删除'-d'.我的问题的原因是我希望了解发生了什么.

我认为finally块总是被调用,而且如果我们无法附加调试器,我希望我的应用程序继续.

  • 如果拒绝附加调试器,为什么没有任何内容打印到控制台?
  • 是否Debugger.Launch()调用 System.Exit失败附?

编辑谢谢@ Moo-Juice我现在知道返回值false意味着调试器已经附加,但上面的问题仍未解决.

c# debugging

5
推荐指数
1
解决办法
643
查看次数

C# - 'Resources' DLL 无法加载,因为它不存在 - 我如何找到引用以便我可以删除它?

我有一个 C# 解决方案,它在编译时吐出一个可执行的二进制文件。二进制文件依赖于一个库,它是我编写的另一个解决方案的产物,所有相关代码都是我创建的。

最近,我以一种相当随意的方式尝试了许多项目设置,试图了解 CLR 构建链接的工作原理。不幸的是(可预见的?)我设法打破了我的二进制文件的链接,但我不知道如何解决这个问题。

  • 当我使用二进制文件时,我会在应用程序崩溃之前收到以下反馈

正在加载程序集........无法在程序集 MY.Library 中添加类型,版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = null - 无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息

  • MY.Library.resources DLL 的融合日志如下。提到的二进制文件不存在,我不知道它在哪里或为什么要加载。

>

All probing URLs attempted and failed

*** Assembly Binder Log Entry  (22/04/2011 @ 10:34:17) ***

The operation failed. Bind result: hr
= 0x80070002. The system cannot find the file specified.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll Running under executable  G:\SVN\dev\Debug\MYExecutable.exe
--- A detailed error log follows. 

=== Pre-bind state information === LOG: User = UBERIT\gavina LOG: DisplayName …
Run Code Online (Sandbox Code Playgroud)

c# dll assembly-resolution

5
推荐指数
1
解决办法
8273
查看次数

C#/ WPF - 重新编译SilverLight 4工具包以便在WPF应用程序中使用是否可行?

我非常喜欢Silverlight 4 Toolkit中提供的一些预构建控件

我理解CLR是不同的,但我希望我可以下载源代码并重新编译WPF使用的CLR.

这可能吗?在WPF工具包是很基本的比较,没有令人鼓舞的评论.

非常感谢.

c# silverlight wpf wpftoolkit silverlight-toolkit

5
推荐指数
1
解决办法
484
查看次数