문제

이것은 매우 복잡한 문제에 관하여 어떻게 데이터를 직렬화를 통해 웹 서비스 전화,데이터는지 강력한 형식입니다.하고 노력하겠습니다 누가 그것을 밖으로 최고의 가능합니다.

샘플 저장체:

[Serializable]
public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }
  public List<NameValuePairs> OtherInfo { get; set; }  
}
[Serializable]   
public class NameValuePairs {
  public string Name { get; set; }
  public string Value { get; set; }
}

샘플 사용:

[WebMethod]
    public List<StorageObject> GetStorageObjects() {
      List<StorageObject> o = new List<StorageObject>() {
        new StorageObject() { 
          Name = "Matthew",
          Birthday = "Jan 1st, 2008", 
          OtherInfo = new List<NameValuePairs>() {
            new NameValuePairs() { Name = "Hobbies", Value = "Programming" },
            new NameValuePairs() { Name = "Website", Value = "Stackoverflow.com" }
          }
        },
        new StorageObject() { 
          Name = "Joe",
          Birthday = "Jan 10th, 2008",
          OtherInfo = new List<NameValuePairs>() { 
            new NameValuePairs() { Name = "Hobbies", Value = "Programming" },
            new NameValuePairs() { Name = "Website", Value = "Stackoverflow.com" }
          }
        }
      };

      return o;
    }

반환 값에서는 웹 서비스:

<StorageObject>
    <Name>Matthew</Name>
    <Birthday>Jan 1st, 2008</Birthday>
    <OtherInfo>
        <NameValuePairs>
            <Name>Hobbies</Name>
            <Value>Programming</Value>
        </NameValuePairs>
        <NameValuePairs>
            <Name>Website</Name>
            <Value>Stackoverflow.com</Value>
        </NameValuePairs>
    </OtherInfo>
</StorageObject>

내가 원하는:

<OtherInfo>
    <Hobbies>Programming</Hobbies>
    <Website>Stackoverflow.com</Website>
</OtherInfo>

유 및 기타 물건:

첫째,내가 미안의 길이는 포스트,하지만 주고 싶어 재현 가능한 코드뿐만 아니라.

내가 원하는 형식이기 때문에,나는 소모 웹 서비스에서 PHP.고 싶은 쉽게 이동:

//이 나타남

In PHP => "$Result["StorageObject"]["OtherInfo"]["Hobbies"]".  

의 경우에는 다른 형식으로,그 다음 것을 달성하는 모든이다.또한,C#면 내가 소비하는 서비스,나는 또한 다음과 같이 할 수 있 다음과 같다:

//이 나타남

In C# => var m = ServiceResult[0].OtherInfo["Hobbies"];

불행하게도,난 어떻게 작업을 수행합니다.나를 얻을 수 있었다 그것은 이 방법으로 구축하여,사용자 정의 사전 구현 IXmlSerializer(참조하십시오 유래:IXmlSerializer 사전),그러나,그것은 불 WSDL 키의 물.그것은 또한 너무 복잡하고,생산 끔찍한 결과를 내 WinFormsTester 응용 프로그램입니다!

이 있을 수행하기 위한 방법은 이?어떤 유형의 객체를 필요 이것을 만드시겠습니까?어떤 방법이 이렇게하려면/이외의함으로써 강력한 형식의 컬렉션/?면 분명히,나는 그것을 강하게 입력한 다음과 같다:

public class OtherInfo {
  public string Hobbies { get; set; }
  public string FavoriteWebsite { get; set; }
}

그것은 완벽하게 작동한 것,내가 없 WSDL 시간에 구애 받지 않고 언제든지 쉽게 액세스할 수 있다 PHP,C#(.OtherInfo.취미).

그러나 나는 완전히 잃고의 점 NVP 의에서 나는 것을 알고 무엇을 사전에 이 목록은,그리고 그것은 변경할 수 있을..말하는,데이터베이스에서.

주셔서 감사합니다 모두가!!난 우리가 할 수 있을 정의 솔루션입니다.여기에는 요구 사항을 다시:

  1. WSDL 키지 않아야 break
  2. 이름 값 쌍(NVP)에 있어야로 직렬화 특성 형식
  3. 액세스 하는 것은 쉬워야 한 NVP s PHP 이름으로["취미"]
  4. 액세스 하는 것은 쉬워야 한 C#(와 호환되 그것으로의 발전기 프록시)
  5. 쉽게 직렬화
  6. 이 필요하지 않을 강력하게 형식의 데이터

지금,나는/전/열을 입력에/더 나은 다른 작업을 수행하는 방법입니다.나는 일부를 저장하는 상대적으로"고정"정보(이름)이며,조각의 무리의 데이터입니다.가 있다면 더 나은 방법으로 여러분의 의견을 듣고 싶습니다.

도움이 되었습니까?

해결책

이처럼 동적 특성에 대한 개체입니다.C#은 매우 동적인 언어와 달리 자바스크립트나 어쩌면 PHP 구문 분석할 수 있는 객체의 속성입니다.다음과 같은 두 가지 방법은 내가 무슨 생각할 수 있습니다.두 번째 하나에 맞게 수 있습으로 귀하의 요구 사항입니다.

키스하는 방법

Keep 그것은 간단한 어리석은 방법

public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }
  public List<string> OtherInfo { get; set; }  
}

할 수 있 이름 값 쌍으로 나뉘는'|'

OtherInfo = {"Hobbies|Programming", "Website|Stackoverflow.com"}

직렬화된 양식

<StorageObject>
    <Name>Matthew</Name>
    <Birthday>Jan 1st, 2008</Birthday>
    <OtherInfo>
        <string>Hobbies|Programming</string>
        <string>Website|Stackoverflow.com</string>
    </OtherInfo>
</StorageObject>

동적 방법 C#

들에게 이름은 값 쌍 부분이 되는 XML 요소할 수 있도록 구축합니다.

public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }
  public XElement OtherInfo { get; set; } // XmlElement for dot net 2
}

을 쉽게 구축할 수 있습까지 OtherInfo 개체 요소로 중심 예:

XElement OtherInfo = new XElement("OtherInfo");
OtherInfo.Add( ..Hobbies xelement & text value..);
OtherInfo.Add( ..WebSite xelement & text value..);

직렬화된 양식이

<OtherInfo>
    <Hobbies>Programming</Hobbies>
    <Website>Stackoverflow.com</Website>
</OtherInfo>

또 그것을 구축으로 특성을 중심

XElement OtherInfo = new XElement("OtherInfo");
OtherInfo.Add( ..nvp xattribute Hobbies & value..);
OtherInfo.Add( ..nvp xattribute WebSite & value..);

<OtherInfo>
    <nvp n="Hobbies" v="Programming" />
    <nvp n="Website" v="Stackoverflow.com" />
</OtherInfo>

모든 동적,언어,그것은에 액세스할 수 있습하는 특성을 직접 있습니다.나머지를 위한,그들은에 액세스할 수 있는 값을 읽 XML.XML 을 읽은 의해 지원되는 대부분의 프레임 워크입니다.

다른 팁

이것은 무엇을 했습니다.

클래스 구조:

public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }
  [XmlAnyElement("Info")]  // this prevents double-nodes in the XML
  public XElement OtherInfo { get; set; }
}

사용법:

StorageObject o = new StorageObject();
o.OtherInfo.Add(new XElement("Hobbies","Programming");
o.OtherInfo.Add(new XElement("Website","Stackoverflow.com");

출력:

<Info>
  <Hobbies>Programming</Hobbies>
  <Website>Stackoverflow.com</Website>
</Info>

나는 모든 사람에게 감사의 말씀을 전합한 그들의 지원,정말 도움을 주셔서 감사합니다.

으로 완전히 다른 이에 대해 생각 하지 왜 그 일을 완전히 다릅니다.하나의 웹 서비스 방법을 반환하는 직렬화된 객체 저장,마이너스 OtherInfo 과는 다른 방법의 목록을 반환하는 속성(키) OtherInfo, 고,세 번째의 목록을 반환하는 값에 대한 모든 키입니다.여,그것은 더 많은 라운드 여행의 웹 서비스하려는 경우 모든 데이터의 그러나 솔루션은 훨씬 더 간단하고 유연합니다.

[Serializable]
public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }

  [Nonserializable]
  public Dictionary<string,List<string>> OtherInfo { get; set; }  
}

[WebMethod]
public List<StorageObject> GetStorageObjects() {
    // returns list of storage objects from persistent storage or cache
}

[WebMethod]
public List<string> GetStorageObjectAttributes( string name )
{
    // find storage object, sObj
    return sObj.Keys.ToList();
}

[WebMethod]
public List<string> GetStorageObjectAtributeValues( sting name, string attribute )
{
    // find storage object, sObj
    return sObj[attribute];
}

새로운 모습을 볼 수 있는 시스템입니다.Xml.Serialization.XmlSerializerAssemblyAttribute 특성이 있습니다.이것은 당신이 지정한 사용자 정의 클래스 수준 serializer.할 수 있을 뱉어 무엇이든 XML 당신이 좋아한다.

하는 빠른 방법을 확인하시기 바랍니다.이러한 사용 sgen.exe 를 생성하고 와서 그것을 가진 반사체.

-Oisin

나는 확실하지 않다 이것은 당신의 문제를 해결하는(그것은 C#,하지만 어쩌면 PHP),만을 사용하여 시험 Dictionary<string,List<string>> OtherInfoList<NameValuePairs>.그런 다음"취미"과"사이트"라는 키와 값은 목록의 취미나 웹 사이트입니다.나는 확실하지 않은 것이 얼마나 직렬화하지만,.

당신은 것을 참조할 수 있의 목록을 취미로:

List<string> hobbies = storageObject.OtherInfo["Hobbies"];

[편집]보 에 대한 일반적인 XML serializable 사전입니다.이 파생 등 한 것을 사용할 필요가 대신의 일반 사전입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top