TFS 2010:为什么不能反序列化词典<字符串对象>与XamlWriter.Save的时候,我可以使用XamlReader用于反序列化 [英] TFS 2010: Why is it not possible to deserialize a Dictionary<string, object> with XamlWriter.Save when I can use XamlReader for deserializing

查看:237
本文介绍了TFS 2010:为什么不能反序列化词典<字符串对象>与XamlWriter.Save的时候,我可以使用XamlReader用于反序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 公共静态字符串的getXML(词典<字符串对象>参数)
{
返回XamlWriter.Save(参数);
}



上面的语句返回引发NotSupportedException



但奇怪的是,我可以使用 XamlReader 连载一本字典。

 公共静态字典<字符串对象> GetParameters(IBuildDetail buildDetail,串buildDefinition)
{
VAR tfsProject = buildDetail.BuildDefinition.TeamProject;
VAR buildServer = buildDetail.BuildServer;
VAR buildDef = buildServer.GetBuildDefinition(tfsProject,buildDefinition);
使用(VAR stringReader =新StringReader(buildDef.ProcessParameters))使用
{
(VAR的XmlTextReader =新的XmlTextReader的(stringReader))
{
返回(词典<字符串,对象>)XamlReader.Load(XmlTextReader的);
}
}
}



中的XML:

 <?XML版本=1.0>?; 
<字典X:TypeArguments =X:字符串,X:对象的xmlns =CLR的命名空间:System.Collections.Generic;装配= mscorlib程序的xmlns:mtbwa =CLR的命名空间:Microsoft.TeamFoundation。 Build.Workflow.Activities;装配= Microsoft.TeamFoundation.Build.Workflow的xmlns:X =http://schemas.microsoft.com/winfx/2006/xaml>

< mtbwa:BuildSettings ProjectsToBuild =$ / XXX /产品/ Company.XXX.Common / Company.XXX.Common.Basic / Company.XXX.Common.Basic.csprojX:键= BuildSettings>

< mtbwa:BuildSettings.PlatformConfigurations>

< mtbwa:PlatformConfigurationList容量=4>

< mtbwa:PlatformConfiguration配置=DEMO平台=值为anycpu/>

< mtbwa:PlatformConfiguration配置=释放平台=值为anycpu/>

< / mtbwa:PlatformConfigurationList>

< / mtbwa:BuildSettings.PlatformConfigurations>

< / mtbwa:BuildSettings>

< mtbwa:TestSpecList容量=0X:键=TestSpecs/>

< X:字符串x:键=BuildNumberFormat>
$(BuildDefinitionName)6.0.0 $(启:.R)
< / X:字符串>

< mtbwa:CodeAnalysisOption X:键=RunCodeAnalysis>
决不
< / mtbwa:CodeAnalysisOption>

< mtbwa:AgentSettings MaxWaitTime =○时十五分00秒TagComparison =MatchExactly标签=X:键=AgentSettings/>

< X:布尔X:键=AssociateChangesetsAndWorkItems>

< / X:布尔>

< X:布尔X:键=CreateWorkItem>

< / X:布尔>

< X:布尔X:键=PerformTestImpactAnalysis>

< / X:布尔>

< X:布尔X:键=CreateLabel>

< / X:布尔>

< X:布尔X:键=DisableTests>

< / X:布尔>

< X:布尔X:键=DoCheckinAssemblyInfoFiles>

< / X:布尔>

< X:字符串x:键=AssemblyVersionPattern>
6.0.0.0
< / X:字符串>

< X:字符串x:键=AssemblyFileVersionPattern>
6.0.0.B
< / X:字符串>

< X:布尔X:键=UseObfuscation>

< / X:布尔>

< X:字符串x:键=ObfuscatorFilePath>
C:\Program文件(x86)\LogicNP Software\Crypto混淆对于2011年净R3\co.exe
< / X:字符串>

< X:字符串x:键=ObfuscatorProjectFile>
$ / XXX /产品/ BuildProcess / Company.XXX.ZZZ.obproj
< / X:字符串>

< X:字符串x:键=ProjectPath>
$ / XXX /产品/ Company.XXX.Common
< / X:字符串>

< /字典>


解决方案

我用的:// www.jetbrains.com/decompiler/相对=nofollow> JetBrains公司dotPeek 来找出微软是如何序列化和反序列化词典<字符串对象> 2010年TFS工作流程。



对于反序列化,他们使用: Microsoft.TeamFoundation.Build.Workflow.WorkflowHelpers.DeserializeProcessParameters(字符串的parameterValues)



序列化,他们使用: WorkflowHelpers.SerializeProcessParameters(IDictionary的<字符串对象>的parameterValues)



大会: Microsoft.TeamFoundation.Build.Workflow.dll



我原来的问题是,我试过排队构建之前添加 IBuildRequest.ProcessParameters 值。

 私有静态无效SetProcessParametersForSubBuild(IBuildRequest buildRequest,字典<字符串对象> processParametersForSubBuild,IBuildDefinition buildDefinition)
{
VAR subBuildProcessParameters = WorkflowHelpers.DeserializeProcessParameters(buildDefinition.ProcessParameters);

如果(processParametersForSubBuild.Any())
{
的foreach(VAR在processParametersForSubBuild processParameter)
{
如果(subBuildProcessParameters.ContainsKey(processParameter.Key ))
{
subBuildProcessParameters [processParameter.Key] = processParameter.Value;
}
,否则
{
subBuildProcessParameters.Add(processParameter.Key,processParameter.Value);
}
}
buildRequest.ProcessParameters = WorkflowHelpers.SerializeProcessParameters(subBuildProcessParameters);
}
}



队列体形:



VAR queuedBuild = buildServer.QueueBuild(buildRequest);


public static string GetXml(Dictionary<string, object> parameters)
{
    return XamlWriter.Save(parameters);
}

The above statement returns a NotSupportedException.

The strange thing is that I can use the XamlReader to serialize a dictionary.

public static Dictionary<string, object> GetParameters(IBuildDetail buildDetail, string buildDefinition)
{
    var tfsProject = buildDetail.BuildDefinition.TeamProject;
    var buildServer = buildDetail.BuildServer;
    var buildDef = buildServer.GetBuildDefinition(tfsProject, buildDefinition);
    using (var stringReader = new StringReader(buildDef.ProcessParameters))
    {
        using (var xmlTextReader = new XmlTextReader(stringReader))
        {
            return (Dictionary<string, object>) XamlReader.Load(xmlTextReader);
        }
    }
}

The XML:

<?xml version="1.0" ?>
<Dictionary x:TypeArguments="x:String, x:Object" xmlns="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:mtbwa="clr-namespace:Microsoft.TeamFoundation.Build.Workflow.Activities;assembly=Microsoft.TeamFoundation.Build.Workflow" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <mtbwa:BuildSettings ProjectsToBuild="$/XXX/Product/Company.XXX.Common/Company.XXX.Common.Basic/Company.XXX.Common.Basic.csproj" x:Key="BuildSettings">

    <mtbwa:BuildSettings.PlatformConfigurations>

      <mtbwa:PlatformConfigurationList Capacity="4">

        <mtbwa:PlatformConfiguration Configuration="DEMO" Platform="AnyCPU"/>

        <mtbwa:PlatformConfiguration Configuration="Release" Platform="AnyCPU"/>

      </mtbwa:PlatformConfigurationList>

    </mtbwa:BuildSettings.PlatformConfigurations>

  </mtbwa:BuildSettings>

  <mtbwa:TestSpecList Capacity="0" x:Key="TestSpecs"/>

  <x:String x:Key="BuildNumberFormat">
    $(BuildDefinitionName) 6.0.0$(Rev:.r)
  </x:String>

  <mtbwa:CodeAnalysisOption x:Key="RunCodeAnalysis">
    Never
  </mtbwa:CodeAnalysisOption>

  <mtbwa:AgentSettings MaxWaitTime="00:15:00" TagComparison="MatchExactly" Tags="" x:Key="AgentSettings"/>

  <x:Boolean x:Key="AssociateChangesetsAndWorkItems">
    False
  </x:Boolean>

  <x:Boolean x:Key="CreateWorkItem">
    False
  </x:Boolean>

  <x:Boolean x:Key="PerformTestImpactAnalysis">
    False
  </x:Boolean>

  <x:Boolean x:Key="CreateLabel">
    False
  </x:Boolean>

  <x:Boolean x:Key="DisableTests">
    True
  </x:Boolean>

  <x:Boolean x:Key="DoCheckinAssemblyInfoFiles">
    True
  </x:Boolean>

  <x:String x:Key="AssemblyVersionPattern">
    6.0.0.0
  </x:String>

  <x:String x:Key="AssemblyFileVersionPattern">
    6.0.0.B
  </x:String>

  <x:Boolean x:Key="UseObfuscation">
    True
  </x:Boolean>

  <x:String x:Key="ObfuscatorFilePath">
    C:\Program Files (x86)\LogicNP Software\Crypto Obfuscator For .Net 2011 R3\co.exe
  </x:String>

  <x:String x:Key="ObfuscatorProjectFile">
    $/XXX/Product/BuildProcess/Company.XXX.ZZZ.obproj
  </x:String>

  <x:String x:Key="ProjectPath">
    $/XXX/Product/Company.XXX.Common
  </x:String>

</Dictionary>

解决方案

I used JetBrains dotPeek to find out how Microsoft is serializing and deserializing a Dictionary<string, object> for TFS 2010 Workflow.

For Deserializing they use: Microsoft.TeamFoundation.Build.Workflow.WorkflowHelpers.DeserializeProcessParameters(string parameterValues)

For Serializing they use: WorkflowHelpers.SerializeProcessParameters(IDictionary<string, object> parameterValues)

Assembly: Microsoft.TeamFoundation.Build.Workflow.dll

My original problem was that I tried to add IBuildRequest.ProcessParameters values before queueing a build.

private static void SetProcessParametersForSubBuild(IBuildRequest buildRequest, Dictionary<string, object> processParametersForSubBuild, IBuildDefinition buildDefinition)
{
    var subBuildProcessParameters = WorkflowHelpers.DeserializeProcessParameters(buildDefinition.ProcessParameters);

    if (processParametersForSubBuild.Any())
    {
        foreach (var processParameter in processParametersForSubBuild)
        {
            if (subBuildProcessParameters.ContainsKey(processParameter.Key))
            {
                subBuildProcessParameters[processParameter.Key] = processParameter.Value;
            }
            else
            {
                subBuildProcessParameters.Add(processParameter.Key, processParameter.Value);
            }
        }
        buildRequest.ProcessParameters = WorkflowHelpers.SerializeProcessParameters(subBuildProcessParameters);
    }
}

Queue Build:

var queuedBuild = buildServer.QueueBuild(buildRequest);

这篇关于TFS 2010:为什么不能反序列化词典&LT;字符串对象&gt;与XamlWriter.Save的时候,我可以使用XamlReader用于反序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆