在我们的客户端/服务器应用程序中,我们一直在使用BinaryFormatter进行序列化过程.出于性能原因,我们尝试迁移到protobuf-net(http://code.google.com/p/protobuf-net/).
我们的软件在客户端和服务器之间传输大量图表.
现在我正在寻找一种方法来确保使用protobuf序列化和反序列化的数据与通常由BinaryFormatter处理的数据完全相同.
逐位比较很简单:我使用BinaryFormatter序列化到文件.使用BinaryFormatter再次反序列化此文件.然后我使用ProtoBuf序列化到一个文件中.使用该文件中的ProtoBuf进行反序列化.使用BinaryFormatter再次序列化到文件中.
然后我可以简单地将该文件与原始文件进行比较.
但是,这两个文件不是100%相等.所以现在我需要找到一种方法来追踪差异.
是否有一些工具可以显示由BinaryFormatter序列化的数据?或者您是否知道其他帮助者进行深入比较并告诉我差异在哪里?
使用XMLSerializer并比较两个XML文件是不可能的,因为BinaryFormatter能够序列化比XMLSerializer更多的数据 - 即使没有明确标记字段.
谢谢,TH
我是一名C#开发人员,习惯于在C#中使用闭包.目前我必须使用匿名javascript函数并遇到以下代码段的问题:
function ClosureTest() {
var funcArray = new Array();
var i = 0;
while (i < 2) {
var contextCopy = i;
funcArray[i] = function() { alert(contextCopy); return false; };
i++;
}
funcArray[0]();
funcArray[1]();
}
Run Code Online (Sandbox Code Playgroud)
我希望第一个funcArray()电话说0,第二个说1.然而,他们都说1.怎么可能?
通过写作,var contextCopy = i我确保我创建了i-variable 的副本.然后,在每次迭代中,我创建一个全新的函数指针.每个函数都指自己的副本i,即contextCopy.但是,由于某些原因,两个创建的函数都引用相同的contextCopy变量.
这在javascript中如何工作?
到目前为止.NET COM互操作总是很好用.自从我升级到Windows 7后,我不再使用我的.NET COM对象了.
我的COM对象很简单:
namespace Crap
{
[ComVisible(true)]
[Guid("2134685b-6e22-49ef-a046-74e187ed0d21")]
[ClassInterface(ClassInterfaceType.None)]
public class MyClass : IMyClass
{
public MyClass()
{}
public void Test()
{
MessageBox.Show("Finally got in here.");
}
}
}
namespace Crap
{
[Guid("1234685b-6e22-49ef-a046-74e187ed0d21")]
public interface IMyClass
{
}
}
程序集也标记为ComVisible.
我使用注册程序集
regasm /codebase /tlb "path"Run Code Online (Sandbox Code Playgroud)
注册成功(管理员模式).我试过了regasm 32和64bit.两次我都收到错误
"ActiveX组件无法使用此vbscript创建对象Crap.MyClass":
dim objReg
Set objReg = CreateObject("Crap.MyClass")
MsgBox typename(objReg)
fuslogvw也没有给我任何提示.COM对象在我的Vista 32 Bit机器上完美运行.
我不明白为什么我无法谷歌解决这个问题的解决方案..我真的是唯一遇到过这个问题的人吗?
看OleView我看到我的对象已成功注册.我也能够创建其他COM对象..它只适用于我自己的对象.
谢谢你,凯文
我正在为以下问题寻找一个优雅的解决方案.
假设我们有一个具有以下布尔属性的(View)模型:
接下来,我在表面上有5个控件,只有在满足基于这些属性的条件时才能看到它们.当然,只要更新其中一个属性,就应该立即传播更改:
到目前为止我提出的唯一解决方案是使用MultiValueConverters.
ControlA的示例:
<ControlA>
<ControlA.Visibility>
<MultiBinding Converter={StaticResource ControlAVisibilityConverter}>
<Binding Path="Alpha"/>
<Binding Path="Beta"/>
<Binding Path="Gamma"/>
</MultiBinding>
</ControlA.Visibility>
</ControlA>
Run Code Online (Sandbox Code Playgroud)
此ControlAVisibilityConverter检查条件"Alpha &&(Beta || Gamma)"并返回适当的值.
它确实有用......好吧..但也许你可以想出一个更优雅的解决方案?
谢谢TwinHabit
我有一个 WPF 控件,我想在我的 WinForms 应用程序(使用 ElementHost)的多个位置(=> 此控件的多个实例)中使用它。
此外,我希望我的 UserControl 的所有实例共享一个 ResourceDictionary 的单个实例。
在 WPF 应用程序中,我将通过在应用程序资源中合并我的 ResourceDictionary 来实现这一点。
但是,我不想在我的 WinForms 应用程序中创建 WPF 应用程序实例。相反,我正在寻找另一种方式。
我找到了一个解决方案,但我希望您知道一种不需要任何代码的更好方法:
public static class StaticRDProvider
{
static ResourceDictionary rd;
static StaticRDProvider()
{
var uri = new Uri("WpfControls;Component/GlobalResourceDictionary.xaml", UriKind.Relative);
rd = (ResourceDictionary) Application.LoadComponent(uri);
}
public static ResourceDictionary GetDictionary
{
get { return rd; }
}
}
Run Code Online (Sandbox Code Playgroud)
用户控件.xaml.cs:
public partial class MyCustomUserControl : UserControl
{
public MyCustomUserControl()
{
Resources.MergedDictionaries.Add(StaticRDProvider.GetDictionary);
InitializeComponent();
}
}
Run Code Online (Sandbox Code Playgroud)
那个有效。但我更喜欢只适用于 XAML 的解决方案。另外我希望能够使用静态资源。因此,在控件初始化后将静态 ResourceDictionary 添加到 Controls MergedDictionaries 不是一个选项。 …
.net ×4
wpf ×2
c# ×1
closures ×1
com ×1
converter ×1
function ×1
interop ×1
javascript ×1
multibinding ×1
mvvm ×1
protobuf-net ×1