小编Lea*_*ner的帖子

Linq to Xml VS XmlSerializer VS DataContractSerializer

在我看来web method,我得到了一些第三方C#实体类的对象.实体类只不过是DataContract.这个实体类非常复杂,具有各种类型的属性,一些属性也是集合.当然,这些链接类型也是DataContracts.

我想将该DataContract实体序列化为XML,作为我的Web服务的业务逻辑的一部分.我不能DataContractSerializer直接使用(在我在web方法中收到的对象),因为XML模式完全不同. 因此,DataContractSerializer生成的XML不会针对模式进行验证.

我无法总结出我应该遵循的方法来实施.我可以想到以下实施方法:

  1. LINQ to XML - 这看起来不错,但我需要为每种类型的对象手动创建XML树(即类实例的元素或XML表示).由于有许多实体类并且它们彼此链接,我认为手动编写XML元素太多了.此外,当实体类引入一些新属性时,我将不得不继续修改XML树.不仅如此,我生成XML树的代码看起来有点笨拙(至少在外观上)并且将来很难被其他开发人员维护/更改; 他/她将不得不仔细研究它以了解如何生成XML.

  2. XmlSerializer - 我可以编写自己的实体类来表示我想要的XML结构.现在,我需要将传入对象的详细信息复制到我自己的类的对象中.所以这是额外的工作(对于.NET,当代码执行时也是如此!).然后我可以XmlSerializer在我的对象上使用生成XML.在这种情况下,我将不得不创建实体类,每当第三方实体被修改时,我只需要在我的类中添加新属性.(使用XmlElement或XmlAttibute属性).但人们推荐DataContractSerializer这个,所以我不想最终确定这个,除非我清楚所有方面.

  3. DataContractSerializer - 再次在这里,我将不得不编写自己的实体类,因为我无法控制第三方DataContracts.我需要将传入对象的细节复制到我自己的类的对象中.所以这是额外的工作.但是,由于DataContractSerializer不支持Xml属性,因此我必须IXmlSerializableWriteXml方法中实现并生成所需的Xml .DataContractSerializer比XmlSerializer更快,但如果第三方实体发生变化,我将不得不处理更改(在WriteXml中).

问题:

  • 考虑到性能,在这种情况下哪种方法最好?
  • 你能建议一些更好的方法吗?
  • 当传入的实体类可能发生变化时,是否DataContractSerializer值得考虑(因为它具有更好的性能XmlSerilaizer)?
  • LINQ应该真的用于序列化吗?或者除了查询之外的其他内容真的有用吗?
  • 在这种情况下,XmlSerializer可以优于LINQ吗?如果是,为什么?

serialization xml-serialization .net-4.0 linq-to-xml datacontractserializer

20
推荐指数
2
解决办法
6473
查看次数

为什么构建在Visual Studio中失败,因为它无法从引用的程序集中解析名称空间?

我有3个类库项目.让我们称他们为A,B和C.我已将project referenceA和B 添加到项目C中.

A&B正在建设中,没有任何错误或警告.

项目C中的代码(类文件)使用A和B中的公共类.当我在C中添加项目引用并查看C项目中的类文件(在构建项目C之前)时,我可以清楚地看到所有类和来自A和B的名称空间已解析.当我将鼠标悬停在类名(A或B中的类)上时,它也会显示它的正确名称空间.

我已经在项目引用上设置了Copy Local属性True.

然而,

  1. 当我运行Rebuild All(或在项目C上构建)时,构建失败,因为它无法解析命名空间!我可以进一步检查以确保一切正确完成?
  2. 我从来没有发现A&B的程序集被复制到bin\debug项目C 的文件夹中.为什么不复制引用?(我已经看到了关于这个问题的几个问题,但没有提供给他们的解决方案对我有用)

.net assemblies project-reference visual-studio-2010 visual-studio

17
推荐指数
2
解决办法
7713
查看次数

如何使用重复键对列表进行排序?

我有一组元素/键,我正在从两个不同的配置文件中读取.因此,键可以是相同的,但具有与它们中的每一个相关联的不同值.

我想按排序顺序列出它们.我能做什么 ?我尝试了SortedList类,但它不允许重复键.

我该怎么做?

例如,假设我有3个元素,键1,2,3.然后我得到一个具有键2(但值不同)的元素.然后我希望新密钥在现有密钥2之后但在3之前插入.如果我在找到一个带有密钥2的元素,那么它应该在最近添加的密钥2之后.

请注意,我使用的是.NET 2.0

c# generic-list .net-2.0 data-structures

12
推荐指数
4
解决办法
2万
查看次数

将异常冒泡到堆栈顶部是否可以?

是不是可以让异常冒泡到堆栈顶部而不是在每个方法中捕获它?我们应该在任何情况下都这样做吗?.. 这种方法是否存在任何微妙的问题或副作用(例如,丢失异常细节,堆栈跟踪或内部异常细节等)?


虽然我的问题很笼统,但我目前的情况如下:

我正在将现有的WSE3 Web服务移动到WCF,因此y客户端是WSE3客户端.

我添加了一个行为,以便FaultException在WCF服务中发生时将通知客户端.当方法中有异常时OperationContract,我在客户端获得异​​常消息没有任何问题.但是每当它出现在OperationContracts 以外的方法中时,我都会以某种方式得到与安全相关的问题.我无法确定确切的原因.

但是,作为一种解决方法,我想OperationContract只从异常中抛出异常并让异常冒泡到OperationContract.

.net c# wcf exception-handling

10
推荐指数
2
解决办法
5591
查看次数

如何使用TFS映射现有文件夹(移动到新机器)而无需从TFS下载整个数据?

之前我已将本地文件夹映射到TFS.由于某种原因,我不得不更换机器/电脑.所以我将所有文件夹复制到新机器上.

现在,当我尝试将TFS文件夹映射到新计算机上的现有文件夹时,它始终显示Not Downloaded在(VS 2010)的Latest列下Source Control Explorer.我可以获得最新版本,但这非常耗时.

有人可以建议一种方法在较短的时间内建立现有文件夹和TFS文件夹之间的关系吗?

workspace visual-studio-2010 tfs2010 tfvc

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

如何以编程方式知道计算机上是否启用了消息队列?

我知道当我尝试创建新的时MessageQueue,InvalidOperationException如果未启用消息队列,系统将抛出.

但是如何以编程方式知道机器上是否启用了消息队列?我在两个不同的代码库中使用C#2.0和C#4.0.

.net c# msmq

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

如何以XML方式在winform中显示Xml数据?

我的winform应用程序与Web服务通信.对于某些要求,我需要在winform应用程序中以XML格式显示Web服务响应.

我可以将响应类型(类)实例序列化为XML字符串.但是当我在富文本框中显示该字符串时,它显然显示为连续字符串; 而不是如下所示的XML.

<UserServiceAccesses>
- <UserServiceAccess>
-   <Service>
       <ID>0</ID> 
       <LocalID>Loggerr</LocalID> 
       <SystemID>-1</SystemID> 
       <ServiceType>U</ServiceType> 
       <Name>MyLogger</Name> 
       </Service>
    <ClientPermissions /> 
  </UserServiceAccess>
- <UserServiceAccess>
-     <Service>
         <ID>0</ID> 
         <LocalID>Logger2</LocalID> 
         <SystemID>-1</SystemID> 
         <ServiceType>U</ServiceType> 
         <Name>MyLogger2</Name> 
     </Service>
     <ClientPermissions /> 
  </UserServiceAccess>
<UserServiceAccesses>
Run Code Online (Sandbox Code Playgroud)

这里UserServiceAccesses是具有类型属性的类UserServiceAccess.然后UserServiceAccess有一个类型的属性Service,ClientPermissions

我该怎么做?它可以是任何形式(树,表,文本等),但它应该是XML可读的.由于我们从应用程序调用了很多Web方法,因此每次XML结构都会有所不同,因此我们无法确定模式.

.net c# xml-serialization winforms

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

按Enter键时如何关闭WPF窗口(对话框)?

我有一个WPF window作为模态对话框打开.

在对话框中,我有OK&Cancel按钮,其属性分别设置为IsDefault&.这两个按钮都有关闭对话框的事件处理程序.IsCancelTrueClick

这是相关的XAML:

<StackPanel Orientation="Horizontal" Grid.Row="1"  Height="45" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="190">
    <Button Content="OK"
                Height="25" Margin="10,10,10,10" Width="75" Name="btnOK" TabIndex="1600" IsDefault="True" Click="btnOK_Click"                       
                VerticalContentAlignment="Center" HorizontalContentAlignment="Center" />
    <Button Content="Cancel"
                Height="25" Margin="10,10,10,10" Width="75" Name="btnCancel" TabIndex="1700" IsCancel="True"
                VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Click="btnCancel_Click" />
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

这是后面的代码:

private void btnOK_Click(object sender, RoutedEventArgs e)
{
    // My some business logic is here                
    this.Close();
}

private void btnCancel_Click(object sender, RoutedEventArgs e)
{
    this.Close();
}
Run Code Online (Sandbox Code Playgroud)

当我按下Esc键盘上的Cancel按钮时(即使焦点不在按钮上),对话框也会按预期关闭.但是,当按下按钮时按下Enter按键时OK …

c# wpf xaml wpf-controls wpfdatagrid

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

FTP"ls -lt"命令:它如何列出Linux FTP和Windows FTP服务器的文件详细信息?

我正在编写FTP客户端,至少应该适用于Windows和Linux FTP.在我继续之前,我想回答这些问题.

  1. 当FTP ls -lt命令用于Linux上的FTP服务器时,列出了哪些文件?
  2. 是否有任何特定的格式/逻辑,其中所有Linux FTP服务器都提供文件列表?例如,DateTime标记将始终存在,文件按"修改日期"的降序列出或类似这样.
  3. 当FTP ls -lt命令用于Windows上的FTP服务器时,列出了哪些文件?
  4. 是否有任何特定的格式/逻辑,其中所有Windows FTP服务器都提供文件列表?
  5. 你能指导我一些有助于理解这一点的文件吗?有没有为此定义的标准?

注意:我尝试在Windows和Linux FTP服务器上执行命令,但我无法找出任何特定的逻辑/格式.

linux ftp ftp-client ftpwebrequest ftp-server

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

在处理类实例时,我是否需要显式处理其所有IDisposable成员?

我有一个具有该类型属性的类SqlConnection.SqlConnection实施IDisposable.我有以下问题:

  1. 我的类是否也应该实现IDisposable,因为它具有类型的属性IDisposable
  2. 如果是,我在处理类的实例时是否需要显式处理属性?例如

    public class Helper : IDisposable
    {
        // Assume that it's ANY OTHER IDisposable type. SqlConnection is just an example.
        public SqlConnection SqlConnection { get; set; }
    
        public void Dispose()
        {
            if (SqlConnection!= null)
            {
                SqlConnection.Dispose();
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

注意:我知道在实施时需要遵循一种模式,IDisposable但我的问题非常具体到上述情况.

.net c# garbage-collection idisposable

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