小编Scr*_*uck的帖子

如何使用ProtoBuf-Net序列化继承的类

如果这是重复,我很抱歉.我在几个地方搜索了一些我可能理解的答案,包括:

ProtoBuf.net序列化派生类时不包括基类属性

使用protobuf-net序列化继承的类

我道歉但我并不真正理解答案.我正在寻找一个更快,更紧凑的二进制序列化器,ProtoBuf看起来可能是答案.我需要序列化一组所有派生自一个基类的类.它们有很多,所以在提交编辑类代码之前,我运行了一个简单的测试.此外,我不想以任何可能影响反序列化使用NET二进制序列化程序生成的旧持久文件的方式修改类.

这是基类:

[ProtoContract]
    public class BaseClass
    {
        [ProtoMember(1)]
        public string Name
        {
            get; set;
        }
        [ProtoMember(2)]
        public int Age
        {
            get; set;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是派生类:

[ProtoContract]
    public class SubClass1 : BaseClass
    {
        [ProtoMember(3)]
        public string Town
        {
            get; set;
        }

        [ProtoMember(4)]
        public Sex Sex
        {
            get; set;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是序列化和反序列化的代码(直接来自"入门指南"

var person = new SubClass1 { Age = 25, Name = "Fred", Town = "Denbigh", Sex = Sex.Female };

            using (var file = File.Create(filename))
            {
                Serializer.Serialize(file, person); …
Run Code Online (Sandbox Code Playgroud)

c# serialization protobuf-net

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

编写具有设备名称的文件

我遇到了好奇的事.我有一个反编译器从二进制文件中提取信息.我正在提取一系列对象,我需要将它们作为二进制文件单独写入磁盘.这些对象是编译到库中的图形模型.对象中嵌入了名称,我需要使用该名称作为文件名.

我在用 :

try {
            // Open file for reading . 
            using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write)) {
                // Writes a block of bytes to this stream using data from a byte array. . 
                fileStream.Write(byteArray, 0, byteArray.Length);
                // close file stream . 
                fileStream.Close();
            }
            return true;
        }

        catch (Exception exception) {
            return false;
        }
Run Code Online (Sandbox Code Playgroud)

我意识到我的异常处理并不好!但是,当其中一个要保存的对象名为COM2时,问题就出现了.这导致异常:

FileStream不会打开Win32设备,如磁盘分区和磁带驱动器.

所以在我的例子中,我试图编写一个名为COM2.mdl的文件并得到此错误.我真的不想更改这些名称,因为它们是由开发人员嵌入的.

我考虑根据可能导致错误的设备列表测试名称 - 但我真的不知道该列表可能是什么,也意味着更改我不想做的文件的名称.

所以我的问题是:有没有办法将字节数组写为二进制文件而不是FileStream可能会解决这个问题?

非常感谢

c# filestream

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

System.Drawing Out of Memory Exception

我的应用程序图形引擎抛出这些异常.它们都被空的捕获块消耗掉.在早期,我发现了一个没有被困的人(我回忆起与笔扩大有关).我用try和一个空的catch块包围它.似乎这些例外对所产生的图纸没有影响.我已经对此做了一些阅读而没有真正了解或深入了解它.

所以我的问题:

  1. 如果可以安全食用,为什么会抛出这些?和
  2. 忽视它们是否安全?我担心每个人都有一些隐藏的效果.我有内存泄漏,例如我从未找到过.

c# system.drawing

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

拖放到桌面图标上

我认为这应该很简单.我在这里看过类似的问题,但我的老大脑不清楚它应该如何运作.我有一个Windows窗体应用程序.我的用户想要将文件拖到桌面上的应用程序图标上,然后使用该文件执行程序.所以我想做的是:

接受图标上的删除文件; 启动应用程序并将文件路径详细信息放入文本框中,以便用户可以处理它.

该应用程序是用C#编写的

谢谢

c# drag-and-drop winforms

6
推荐指数
1
解决办法
4345
查看次数

从非执行可执行文件中获取版本

我知道如何获得正在执行的应用程序或DLL的版本.但是,我需要找到一个不执行的应用程序的属性.

我有一个小程序来为我的主应用程序设置文件关联.由于应用程序在启动时不接受参数,因此运行此版本的旧版本的用户没有意义.因此,当文件关联器启动时,首先检查它是否可以找到主应用程序.如果可以,那么我想检查属性而不执行它.如果版本早于可以接受参数的版本,那么我想告诉我的用户更新而不是继续设置关联.

我查看了System.IO.FileInfo,但似乎没有包含任何版本信息.

谢谢

c#

6
推荐指数
1
解决办法
2406
查看次数

通过 C# 从注册表中的“UserChoice”项中删除“拒绝”规则(权限)

我正在研究文件关联。我已经确定有一个名为UserChoice以下的密钥:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\[ext].
Run Code Online (Sandbox Code Playgroud)

UserChoice只要创建了该密钥并且Windows尚未创建该密钥,我就能够读取和写入该密钥。但是,如果Windows已经UserChoice创建了该密钥,那么我需要以管理员身份运行才能访问该密钥。我的最终目标是删除密钥。UserChoice

我注意到 Windows在该密钥上放置了拒绝UserChoice规则,这阻止了我删除该密钥。如果我能成功删除该规则,我相信我将能够删除该UserChoice密钥。这是我尝试过的代码:

public static void ShowSecurity(RegistryKey regKeyRoot, string user) {
    RegistrySecurity security = regKeyRoot.GetAccessControl(AccessControlSections.All);

    foreach (RegistryAccessRule ar in
        security.GetAccessRules(true, true, typeof(NTAccount))) {

        if (ar.IdentityReference.Value.Contains(User) &&
                ar.AccessControlType.ToString().ToLower() == "deny") {

            security.RemoveAccessRuleSpecific(ar);
            regKeyRoot.SetAccessControl(security);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当 Windows 创建UserChoice密钥时,它会为当前用户添加一条 Type Deny 的安全规则;许可:特殊。该规则不被继承,UserChoice仅适用于密钥。

通过一些混乱并以管理员身份运行,我可以访问它RegistryAccessRule。然而,即使以管理员身份运行,我也无法删除此规则。我在我的研究中读到过,没有一种程序化的方法可以做到这一点。我可以通过 RegEdit 删除此规则。我还可以UserChoice使用 NirSoft 的文件类型管理器删除密钥。所以我认为有某种方法可以做到这一点。

摘要:有没有一种方法可以删除拒绝规则,以便我可以删除密钥UserChoice …

c# security registry registrykey

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

允许两个应用程序实例运行

我理解如何使用互斥锁强制应用程序的单个实例,这就是我使用的.

我的一些用户要求我允许运行多个实例.我不想删除控制代码,因为我可以将其视为灾难的处方,因为多个实例可能正在写入相同的文件,日志等.

如果实例的数量限制为两个,我也许可以处理.我目前的想法是允许第一个以某种形式的只读模式运行作为活动的一个和第二个.

那么我如何控制实例数量不超过两个呢?

谢谢

c#

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

空引用异常与空对象无关

我很困惑(这很容易!).我有一小段代码,我已截取屏幕截图.

NRE在文件路径测试失败后出现.什么都没有.SceneryAreas对象在此测试之前初始化.然而(我的截图没有拿起它)似乎在SceneryAreas.Clear()行中; 那个SceneryAreas是null.是否有可能错误显示在错误的行上,更多的是实例化的对象如何在此时变为空?

VS 2010 IDE的屏幕截图

非常感谢任何建议 - 我以前从未见过这个.

c# nullreferenceexception

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

使用ReSharper和StyleCop处理此关键字和打开括号

我希望有人可以帮助我.过去几周我一直在寻找和关闭.这是一件令我烦恼的事情的两部分问题!

我不喜欢这个关键字卡在一切之前.在我安装Stylecop之前,我记得ReSharper提议将这些删除为冗余.使用StyleCop不再发生这种情况.更糟糕的是当我重新格式化或以其他方式摆弄代码时,这个关键字似乎自动出现在我没有要求的地方.我试过关闭StyleCop的检查并打开ReSharpers.RS不提供删除它.我已经得出结论,它必须与代码格式化有关,但我找不到任何东西.

一个较小的烦恼是我更喜欢我的开口支架与它所指的声明在同一条线上.它再次被分流了.我想知道这是否在同一地区,我只是没有看到树木.

c# resharper stylecop visual-studio

2
推荐指数
1
解决办法
822
查看次数

是否有更好的方法来处理按键?

我的WinForms应用程序中的大多数功能都有一个按键替代方案.有很多.目前我在switch语句中处理这个问题.我的代码分析器告诉我,这段代码不可维护到不同程度的讨厌.我必须同意.我会将处理代码提取出来以分离方法,但在大多数情况下,这只是一行或两行,它并没有真正帮助我处理事情.....

是否有更好的方法来解决这个问题我是否坚持使用巨大的开关?

提前致谢

c# winforms

0
推荐指数
1
解决办法
154
查看次数

如何处理目录名称中的重音字符

我在使用Directory.Exists()包含重音字符的字符串时遇到问题.

这是目录路径: D:\ést_test\scenery.它作为我正在解析的文件中的一个简单字符串进入:

[Area.121]
Title=ést_test
local=D:\AITests\ést_test
Layer=121
Active=FALSE
Required=FALSE
Run Code Online (Sandbox Code Playgroud)

我的代码采用本地值并添加\scenery到它.我需要测试它是否存在(它确实存在)并且只是使用:

if (!Directory.Exists(area.Path))
            {
                // some handling code
                area.AreaIsValid = false;
            }
Run Code Online (Sandbox Code Playgroud)

这返回false.我正在做的字符串处理似乎正在替换重音字符.VS2012中的文本可视化器显示了这一点(directoryManager只是一个环绕System.IO.Directory):

在此输入图像描述

显示的警告消息显示如下:

在此输入图像描述

因此似乎没有被识别出重音字符.搜索此问题确实出现了,但主要是关于删除或替换重音字符.我目前正在使用'普通'字符串处理.我尝试过使用,FileInfo但无论如何,路径似乎都被破坏了.

所以我的第一个问题是如何将路径存储到字符串中以便它通过Directory.Exists测试?

这引发了路径名中非拉丁字符的更广泛问题.我有世界各地的用户,所以我可以看到阿拉伯语.俄罗斯人,中国人等在路上.我该如何处理所有这些?

c# localizable.strings

0
推荐指数
1
解决办法
1003
查看次数