Utilizzare i tipi protobuf

Poiché l'API Google Ads utilizza proto3 come formato di payload predefinito, è importante comprendere alcune convenzioni e alcuni tipi di Protocol Buffer quando si lavora con la libreria client .NET.

Campi facoltativi

Molti campi dell'API Google Ads sono contrassegnati come optional. In questo modo puoi distinguere i casi in cui il campo ha un valore vuoto da quelli in cui il server non restituisce un valore per il campo. Questi campi si comportano come proprietà normali, ma forniscono anche metodi aggiuntivi per cancellare il campo e per verificare se è impostato.

Ad esempio, il campo Name dell'oggetto Campaign è contrassegnato come optional, quindi puoi utilizzare i seguenti metodi per lavorare con questo campo:

// Get the name.
string name = campaign.Name;

// Set the name.
campaign.Name = name;

// Check if the campaign object has the name field set.
bool hasName = campaign.HasName();

// Clear the name field. Use this method to exclude the Name field from
// being sent to the server in a subsequent API call.
campaign.ClearName();

// Set the campaign name to an empty string value. This value will be
// sent to the server if you use this object in a subsequent API call.
campaign.Name = "";

// This throws a runtime ArgumentNullException. Use ClearName() instead.
campaign.Name = null;

Campi ripetuti

Un array di campi è rappresentato nell'API Google Ads come RepeatedField di sola lettura.

Ad esempio, il campo url_custom_parameters di una campagna è un campo ripetuto, quindi è rappresentato come un RepeatedField<CustomParameter> di sola lettura nella libreria client .NET. RepeatedField<T> implementa l'interfaccia IList<T>.

Esistono due modi per compilare una proprietà RepeatedField:

Metodo AddRange

Campaign campaign = new Campaign()
{
    ResourceName = ResourceNames.Campaign(customerId, campaignId),
    Status = CampaignStatus.Paused,
};

// Add values to UrlCustomParameters using the AddRange method.
campaign.UrlCustomParameters.AddRange(new CustomParameter[]
{
    new CustomParameter { Key = "season", Value = "christmas" },
    new CustomParameter { Key = "promocode", Value = "NY123" }
});

Sintassi dell'inizializzatore di raccolta

// Option 1: Initialize the field directly.
Campaign campaign = new Campaign()
{
    ResourceName = ResourceNames.Campaign(customerId, campaignId),
    Status = CampaignStatus.Paused,
    // Directly initialize the field.
    UrlCustomParameters =
    {
        new CustomParameter { Key = "season", Value = "christmas" },
        new CustomParameter { Key = "promocode", Value = "NY123" }
    }
};

// Option 2: Initialize using an intermediate variable.
CustomParameter[] parameters = new CustomParameter[]
{
    new CustomParameter { Key = "season", Value = "christmas" },
    new CustomParameter { Key = "promocode", Value = "NY123" }
};

Campaign campaign1 = new Campaign()
{
    ResourceName = ResourceNames.Campaign(customerId, campaignId),
    Status = CampaignStatus.Paused,
    // Initialize from an existing array.
    UrlCustomParameters = { parameters }
};

Campi Oneof

Alcuni campi dell'API Google Ads sono contrassegnati come campi oneof, il che significa che il campo può contenere tipi diversi, ma un solo valore alla volta. I campi oneof sono simili a un tipo di unione nel linguaggio di programmazione C.

La libreria .NET implementa i campi oneof fornendo una proprietà per ogni tipo di valore che può essere contenuto in un campo oneof, con tutte le proprietà che aggiornano un campo di archiviazione sottostante condiviso.

Ad esempio, il campaign_bidding_strategy della campagna è contrassegnato come campo oneof. Questa classe è implementata come segue (codice semplificato per brevità):

public sealed partial class Campaign : pb::IMessage<Campaign>
{
    object campaignBiddingStrategy_ = null;
    CampaignBiddingStrategyOneofCase campaignBiddingStrategyCase_;

    public ManualCpc ManualCpc
    {
        get
        {
            return campaignBiddingStrategyCase_ ==
                CampaignBiddingStrategyOneofCase.ManualCpc
                ? (ManualCpc)campaignBiddingStrategy_ : null;
        }
        set
        {
            campaignBiddingStrategy_ = value;
            campaignBiddingStrategyCase_ =
                CampaignBiddingStrategyOneofCase.ManualCpc;
        }
    }

    public ManualCpm ManualCpm
    {
        get
        {
            return campaignBiddingStrategyCase_ ==
                CampaignBiddingStrategyOneofCase.ManualCpm
                ? (ManualCpm)campaignBiddingStrategy_ : null;
        }
        set
        {
            campaignBiddingStrategy_ = value;
            campaignBiddingStrategyCase_ =
                CampaignBiddingStrategyOneofCase.ManualCpm;
        }
    }

    public CampaignBiddingStrategyOneofCase CampaignBiddingStrategyCase
    {
        get { return campaignBiddingStrategyCase_; }
    }
}

Poiché le proprietà oneof condividono lo spazio di archiviazione, un'assegnazione può sovrascrivere un'assegnazione precedente, causando bug sottili. Ad esempio:

Campaign campaign = new Campaign()
{
    ManualCpc = new ManualCpc(),
    ManualCpm = new ManualCpm()
};

In questo caso, campaign.ManualCpc è null perché l'inizializzazione della proprietà campaign.ManualCpm sovrascrive l'inizializzazione precedente per campaign.ManualCpc.

Conversione in altri formati

Converti in formato JSON

Puoi convertire gli oggetti protobuf in formato JSON e viceversa utilizzando Google.Protobuf.JsonFormatter. Ciò è utile quando si creano sistemi che devono interfacciarsi con altri sistemi che richiedono formati basati su testo come JSON o XML.

using Google.Protobuf;

GoogleAdsRow row = new GoogleAdsRow()
{
    Campaign = new Campaign()
    {
        Id = 123,
        Name = "Campaign 1",
        ResourceName = ResourceNames.Campaign(1234567890, 123)
    }
};

// Serialize to JSON and back.
string json = JsonFormatter.Default.Format(row);
row = GoogleAdsRow.Parser.ParseJson(json);

Converti in byte

Puoi serializzare un oggetto in byte e viceversa utilizzando Google.Protobuf. La serializzazione binaria è più efficiente in termini di memoria e spazio di archiviazione rispetto al formato JSON.

using Google.Protobuf;

GoogleAdsRow row = new GoogleAdsRow()
{
    Campaign = new Campaign()
    {
        Id = 123,
        Name = "Campaign 1",
        ResourceName = ResourceNames.Campaign(1234567890, 123)
    }
};

// Serialize to bytes and back.
byte[] bytes = row.ToByteArray();
row = GoogleAdsRow.Parser.ParseFrom(bytes);