2012-03-06 2 views
7
public static string GetXml(Dictionary<string, object> parameters) 
{ 
    return XamlWriter.Save(parameters); 
} 

의 직렬화 복원을 위해 XamlReader를 사용할 수있을 때 가능하지 XamlWriter.Save와 사전 <문자열, 개체> 역 직렬화하는 이유.TFS 2010 : 나는 위의 문은 <code>NotSupportedException</code>을 반환

이상한 점은 XamlReader을 사용하여 사전을 직렬화 할 수 있다는 것입니다.

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

는 XML : 그것은 XamlReader/XamlWriter를 사용하는 필수

<?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> 

답변

2

을 나는 마이크로 소프트가 직렬화 및 TFS 2010 워크 플로우에 대한 Dictionary<string, object> 직렬화를 해제하는 방법을 알아 JetBrains dotPeek을 사용했다. 직렬화 복원을 위해

그들이 사용 :Microsoft.TeamFoundation.Build.Workflow.WorkflowHelpers.DeserializeProcessParameters(string parameterValues)

들이 일렬의 경우는 사용WorkflowHelpers.SerializeProcessParameters(IDictionary<string, object> parameterValues)

어셈블리 : Microsoft.TeamFoundation.Build.Workflow.dll

내 원래 문제는 것이 었습니다 빌드 대기열에 넣기 전에 IBuildRequest.ProcessParameters 값을 추가하려고했습니다.

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

큐 빌드 :

var에 queuedBuild = buildServer.QueueBuild (buildRequest);

1

입니까? 그렇지 않을 경우 - 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); 
     } 
    } 
} 

(https://stackoverflow.com/a/5941122/1246870 학점)

+0

아니요, 필수는 아니지만 동일한 스키마를 가져와야합니다. DataContractSerializer를 사용하면 스키마가 변경됩니다. – Rookian