Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TFS 2010:为什么不能反序列化词典<;字符串,对象>;使用XamlWriter.Save,当我可以使用XamlReader进行反序列化时进行保存_C#_Dictionary_Xamlwriter - Fatal编程技术网

C# TFS 2010:为什么不能反序列化词典<;字符串,对象>;使用XamlWriter.Save,当我可以使用XamlReader进行反序列化时进行保存

C# TFS 2010:为什么不能反序列化词典<;字符串,对象>;使用XamlWriter.Save,当我可以使用XamlReader进行反序列化时进行保存,c#,dictionary,xamlwriter,C#,Dictionary,Xamlwriter,XML: public static Dictionary<string, object> GetParameters(IBuildDetail buildDetail, string buildDefinition) { var tfsProject = buildDetail.BuildDefinition.TeamProject; var buildServer = buildDetail.BuildServer; var buildDef = buil

XML:

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);
        }
    }
}

$(BuildDefinitionName)6.0.0$(修订版:.r)
从未
假的
假的
假的
假的
真的
真的
6.0.0.0
6.0.0.B
真的
C:\Program Files(x86)\LogicNP Software\Crypto Obfuscator For.Net 2011 R3\co.exe
$/XXX/Product/BuildProcess/Company.XXX.ZZZ.obproj
$/XXX/Product/Company.XXX.Common

必须使用XamlReader/XamlWriter吗?如果不是,请查看DataContractSerializer:

<?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>
公共静态类序列化扩展
{
公共静态字符串序列化(此T obj)
{
var serializer=新的DataContractSerializer(obj.GetType());
使用(var writer=new StringWriter())
使用(var stm=new XmlTextWriter(writer))
{
serializer.WriteObject(stm,obj);
返回writer.ToString();
}
}
公共静态T反序列化(此字符串已序列化)
{
var serializer=新的DataContractSerializer(typeof(T));
使用(var reader=newstringreader(序列化))
使用(var stm=新的XmlTextReader(reader))
{
return(T)serializer.ReadObject(stm);
}
}
}
(归功于)

我曾经了解Microsoft是如何序列化和反序列化TFS 2010工作流的
词典的

对于反序列化,它们使用:
Microsoft.TeamFoundation.Build.Workflow.WorkflowHelpers.DeserializeProcessParameters(字符串参数值)

对于序列化,它们使用:
WorkflowHelpers.SerializeProcessParameters(IDictionary ParameterValue)

程序集:Microsoft.TeamFoundation.Build.Workflow.dll

我最初的问题是,在将生成排队之前,我试图添加
IBuildRequest.ProcessParameters

public static class SerializationExtensions
{
    public static string Serialize<T>(this T obj)
    {
        var serializer = new DataContractSerializer(obj.GetType());
        using (var writer = new StringWriter())
        using (var stm = new XmlTextWriter(writer))
        {
            serializer.WriteObject(stm, obj);
            return writer.ToString();
        }
    }
    public static T Deserialize<T>(this string serialized)
    {
        var serializer = new DataContractSerializer(typeof(T));
        using (var reader = new StringReader(serialized))
        using (var stm = new XmlTextReader(reader))
        {
            return (T)serializer.ReadObject(stm);
        }
    }
}
私有静态void SetProcessParametersForSubBuild(IBuildRequest buildRequest、Dictionary processParametersForSubBuild、IBuildDefinition buildDefinition)
{
var subBuildProcessParameters=WorkflowHelpers.DeserializeProcessParameters(buildDefinition.ProcessParameters);
if(processParametersForSubBuild.Any())
{
foreach(processParametersForSubBuild中的var processParameter)
{
if(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)

不,这不是必须的,但必须获得相同的模式。使用DataContractSerializer更改架构。
public static class SerializationExtensions
{
    public static string Serialize<T>(this T obj)
    {
        var serializer = new DataContractSerializer(obj.GetType());
        using (var writer = new StringWriter())
        using (var stm = new XmlTextWriter(writer))
        {
            serializer.WriteObject(stm, obj);
            return writer.ToString();
        }
    }
    public static T Deserialize<T>(this string serialized)
    {
        var serializer = new DataContractSerializer(typeof(T));
        using (var reader = new StringReader(serialized))
        using (var stm = new XmlTextReader(reader))
        {
            return (T)serializer.ReadObject(stm);
        }
    }
}
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);
    }
}